Javascript Firefox加载项SDK:port.on()/port.emit()被iframe中断

Javascript Firefox加载项SDK:port.on()/port.emit()被iframe中断,javascript,iframe,firefox-addon,firefox-addon-sdk,Javascript,Iframe,Firefox Addon,Firefox Addon Sdk,我正在使用插件SDK开发一个firefox插件,在该插件中,我有一个内容脚本(在侧栏中),使用port.on()和port.emit()与主插件脚本通信,如前所述。port.on()/port.emit()工作正常,直到我在侧栏中创建了一个iframe(通过侧栏的内容脚本)一旦添加了iframe,内容脚本和主加载项脚本之间的通信将不再通过port.emit()/port.on()工作。 我创建了一个简单的示例来演示这个问题,当单击插件按钮时,它会打开侧栏。在侧边栏中,我有几个用于测试的kedow

我正在使用插件SDK开发一个firefox插件,在该插件中,我有一个内容脚本(在侧栏中),使用port.on()和port.emit()与主插件脚本通信,如前所述。port.on()/port.emit()工作正常,直到我在侧栏中创建了一个iframe(通过侧栏的内容脚本)一旦添加了iframe,内容脚本和主加载项脚本之间的通信将不再通过port.emit()/port.on()工作。

我创建了一个简单的示例来演示这个问题,当单击插件按钮时,它会打开侧栏。在侧边栏中,我有几个用于测试的kedown事件,当我按下“r”时,它会向主加载项脚本发出一条消息,该脚本会将“im here”打印到控制台(这非常有效),当我按下“t”时,它会创建一个iframe并将其添加到sidebar.html主体中。一旦发生这种情况,按“r”键不再向控制台打印“我在这里”

以下是主加载项脚本:

var buttons     = require('sdk/ui/button/action');
var sidebars    = require("sdk/ui/sidebar");
var wrkrs = []; // holds workers

var button = buttons.ActionButton({
    id: "tester",
    label: "tester",
    icon: {
        "32": "./icons/icon-32.png",
        "48": "./icons/icon-48.png",
        "64": "./icons/icon-64.png",
        "96": "./icons/icon-96.png"
    },
    onClick: function(state){
        sidebar.show();
    }
});


var sidebar = sidebars.Sidebar({
    id: 'test',
    title: 'test', 
    url: "./sidebar.html",
    onReady: function(worker){
        wrkrs.push(worker);
        worker.port.on('talk',function(msg){
            console.log('communication:', msg );
        })
    },
    onDetach: function(worker) {
        var index = wrkrs.indexOf(worker);
        if(index != -1) wrkrs.splice(index, 1);     
    }
});
这是sidebar.html

<!DOCTYPE html>
<html>
    <head>

        <meta charset="utf-8">

    </head>
    <body>


        <h1> this is the sidebar </h1>
        <p>
            hurray!!!!!!
        </p>

        <script src="sidebar.js"></script>

    </body>
</html>
更新

我注意到,如果我创建一个新变量并将全局加载项对象分配给它,如下所示:

var addon2 = addon;
然后,在插入iframe后,这将停止工作(这是我的问题):

但这似乎很有效

addon2.port.emit('talk','im here!');

…这对我来说毫无意义。这可能是解决我问题的一个办法,但它似乎有点笨拙,让我感到紧张

从您在前面的问题中描述的症状来看,我计划检查的第一件事是看
插件
是否遭到了重击/替换(显然是;它肯定不是同一个对象)。保存对原始
addon
对象的引用的解决方法/测试应该是我会立即测试的。现在的诀窍是1)找出发生这种情况的原因,2)可能是什么其他因素导致了这种情况的发生,3)一个好的解决方法/验证保存
加载项的副本是最好的方法,4)查找新的
端口
的位置的额外积分。
插件
每次插入DOM时都是不同的对象。如果是我,我会使用确定的解决方法。根据您在前面的问题中描述的症状,我计划检查的第一件事是查看
插件是否被删除/替换(显然是;它肯定不是同一个对象)。保存对原始
addon
对象的引用的解决方法/测试应该是我会立即测试的。现在的诀窍是1)找出发生这种情况的原因,2)可能是什么其他因素导致了这种情况的发生,3)一个好的解决方法/验证保存
加载项的副本是最好的方法,4)查找新的
端口
的位置的额外积分。
插件
每次插入DOM时都是不同的对象。如果是我,我会使用确定的解决方法。
addon.port.emit('talk','im here!');
addon2.port.emit('talk','im here!');