Firefox附加组件SDK:由iframe

时间:2016-09-03 19:21:14

标签: javascript iframe firefox-addon firefox-addon-sdk

我正在使用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让我紧张

0 个答案:

没有答案