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

Multiple messages from main script to contentscript

本文关键字:脚本 消息      更新时间:2023-10-05

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

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
}

我在这里错过了什么?

每次调用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);