我正在使用Add-on SDK处理firefox插件,在该插件中我有一个内容脚本(在侧边栏中)使用port.on()和端口与主插件脚本进行通信。如here in the Add-on SDK documentation所述的emit()。 port.on()/ port.emit()工作正常,直到我在侧边栏中创建一个iframe(通过侧边栏的内容脚本)。 添加iframe后,内容脚本和主要插件脚本之间的通信将不再通过port.emit()/ port.on()
工作我已经创建了一个简单的示例来演示此问题,当单击插件按钮时,它会打开侧边栏。在侧栏内我有几个用于测试的知识事件,当我按下" r"它会向主要的插件脚本发出一条消息,该脚本会在此处打印出来。当我按下'它创建一个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>
这里是sidebar.js内容脚本
function test(){
var test = document.createElement('iframe');
document.body.appendChild( test );
}
document.body.addEventListener('keydown',function(e){
switch(e.key){
case "r" : addon.port.emit('talk','im here!'); break;
case "t" : test(); break;
}
});
更新:
我注意到如果我创建一个新变量并将全局插件对象分配给它:
var addon2 = addon;
然后插入iframe后,这将停止工作(这是我的问题):
addon.port.emit('talk','im here!');
但这似乎工作正常!?!?!
addon2.port.emit('talk','im here!');
......这对我没有意义。这可能是我的问题的解决方法,但它似乎有点kludgey让我紧张