从主脚本到内容脚本的多条消息

时间:2015-02-11 14:15:35

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

我正在使用以下代码获取正在使用Firefox Addon开发的Mozilla Addon SDK内的远程文件的文件大小。

main.js

// Import the page-mod API
var pageMod = require("sdk/page-mod");
// Import the self API
var self = require("sdk/self");


// Create a page mod
pageMod.PageMod({
    include : "*.example.com",
    contentScriptFile : [self.data.url("content.js"), self.data.url("jquery.min.js"), self.data.url("contentloaded.js")],
    contentScriptWhen : "ready",
    attachTo: ["top", "existing"],
    onAttach : startListening,
    contentScriptOptions : {
        iconWait : self.data.url("wait.gif"),
        iconFinished : self.data.url("done.png"),
    }
});

function startListening(worker) {


    worker.port.on("GetSize", function (data) {

        // Handle the message
        let getReq = require("sdk/request").Request({
                url : data[0],
                onComplete : function (response) {
                    reply = [response.headers["Content-Length"], data[1]];
                    //console.log("Send linkID : " + reply[1]);
                    worker.port.emit('receiveSize', reply);
                }
            }).head();
    });


}

这完全有效,但同一请求会多次调用DisplaySize函数。

content.js

function checkURL(url, linkID) {

    data = [url, linkID];
    self.port.emit("GetSize", data);
    self.port.on("receiveSize", DisplaySize);
    console.log("Inside checkURL For linkID : " + linkID); //<--This displays only once for each request

}

function DisplaySize(data) {


    console.log("Inside DisplaySize For linkID : " + data[1]); //<--But this thrice

}

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

每次调用port.on时,都会添加一个新的消息侦听器。只调用一次。

function checkURL(url, linkID) {
    data = [url, linkID];
    self.port.emit("GetSize", data);
    console.log("Inside checkURL For linkID : " + linkID);
}

function DisplaySize(data) {
    console.log("Inside DisplaySize For linkID : " + data[1]);
}
self.port.on("receiveSize", DisplaySize);