Javascript Firefox加载项SDK:port.on()/port.emit()被iframe中断
我正在使用插件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”键不再向控制台打印“我在这里” 以下是主加载项脚本: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
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!');