如何动态更改Firefox附加组件的页面工作者的ContentURL?

时间:2015-10-09 18:03:05

标签: javascript jquery firefox-addon

我正在开发一个简单的字典插件,允许用户突出显示一个单词(通过双击它),这将导致弹出窗口显示单词的字典定义。

我无法动态更改我正在使用的页面工作者的ContentURL,以便我可以访问其DOM并从中删除定义。 我已尝试动态更改单个页面工作程序的URL,以及每次选择新单词时创建页面工作程序,将信息发送到插件,然后销毁页面工作程序。

这是我的代码(第二个想法):

define.js:

$(window).dblclick(function() {
    var selected = getSelected();
    if (selected!="") {
        calldictionary(selected);
        var completedURL = "http://www.dictionary.com/browse/" + selected;
        $('#define').dialog("open");
        createPageWorker(completedURL);

    }
});

function getSelected() {
    if (window.getSelection) {
        return window.getSelection().toString();
    } else if (document.selection) {
        return document.selection.createRange().text;
    }
    return '';
}

definitionsender.js:

var sendInformation = "var elements = document.querySelectorAll('div.def-set > div'); " +
                      "for (var i = 0; i < elements.length; i++) {" +
                      " postMessage(elements[i].textContent) " +
                      "}" +
                      "self.destroy();";

function createPageWorker(URL){

    dictionaryReference.Page({
        contentScriptWhen: "ready",
        contentScriptFile: [
            data.url("jquery.js"),
            data.url("jquery-ui.min.js"),
            data.url("define.js"),
            data.url("definitionsender.js")
        ],
        contentURL: URL,
        contentScript: sendInformation,
        onMessage: "function(message){"+
        "console.log(message);}"
    });
}

如果我使用的是我的第一个想法,那么

createPageWorker(completedURL);

将替换为

dictionaryReference.contentURL = completedURL;

到页面工作者&#34; dictionaryReference&#34;包含在我的index.js文件中。

请不要简单地发布指向MDN的链接;我已经阅读了所有相关文档,并没有给我很多指导。

1 个答案:

答案 0 :(得分:1)

来自https://developer.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts(原谅我发布MDN文档;-)):

  
      
  • 附加组件的主要代码,包括&#34; main.js&#34; &#34; lib&#34;中的其他模块,可以使用SDK高级和低级API ,但不能   直接访问网页内容
  •   
  • 内容脚本无法使用SDK的API (无法访问全局导出,需要)但可以访问网络内容
  •   

好像您正试图从createPageWorker()访问define.js,这似乎是一个内容脚本。关注点分离是禁止的。沟通的方式是使用像

这样的东西
self.port.emit("createPageWorker", URL);
在内容脚本中

,并通过

收听该消息
self.port.on("createPageWorker", function(URL) { 
    // do something here
);

在附加代码(index.js或其他)中。