0

我正在使用 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 应用程序扩展中替换addEventListenersetTimeout秒钟,我的扩展被正确注入并且运行良好,但选择任意时间注入 iframe 对我来说感觉很脏。

如何使用 Safari App Extensions 将 iframe 正确注入 DOM?

4

1 回答 1

1

在这种情况之间包装我的代码起到了Apple 文档中“注入脚本”部分的作用。

if (window.top === window) {
    // The parent frame is the top-level frame, not an iframe.
    // All non-iframe code goes before the closing brace.
    document.addEventListener('DOMContentLoaded', function(e) {
        var newElement = document.createElement("script");
        newElement.src = safari.extension.baseURI + "bundle.js";
        document.body.insertBefore(newElement, document.body.firstChild);
    });
}
于 2018-11-19T11:13:25.997 回答