我正在使用 Safari App Extension 将我的 WebExtension 移植到 Safari。
我的扩展是 DOM 中的 iframe 注入,所以我想将类似这个注入脚本的东西加载为SFSafariContentScript
.
document.addEventListener('DOMContentLoaded', function(e) {
var newElement = document.createElement("script");
newElement.src = safari.extension.baseURI + "bundle.js";
document.body.insertBefore(newElement, document.body.firstChild);
});
问题是DOMContentLoaded
当我的 iframe 被注入时,事件似乎再次被触发,从而导致无限循环。
这种行为似乎与您对具有两个文件的简单注入脚本所期望的不同,index.html
并且index.js
按预期工作。
───────┬───────────────────────────────────────────────────────────────────
│ File: index.html
───────┼───────────────────────────────────────────────────────────────────
1 │ <html>
2 │ <head>...</head>
3 │ <body><div>...</div></body>
4 │ <script src="index.js"></script>
5 │ </html>
───────┴───────────────────────────────────────────────────────────────────
───────┬───────────────────────────────────────────────────────────────────
│ File: index.js
───────┼───────────────────────────────────────────────────────────────────
1 │ document.addEventListener('DOMContentLoaded', function(e) {
2 │ var newElement = document.createElement('script');
3 │ newElement.src = './bundle.js';
4 │ document.body.insertBefore(newElement, document.body.firstChild);
5 │ });
───────┴───────────────────────────────────────────────────────────────────
如果我在我的 Safari 应用程序扩展中替换addEventListener
几setTimeout
秒钟,我的扩展被正确注入并且运行良好,但选择任意时间注入 iframe 对我来说感觉很脏。
如何使用 Safari App Extensions 将 iframe 正确注入 DOM?