Ajax 如何使用mozilla sdk分离内容脚本?

Ajax 如何使用mozilla sdk分离内容脚本?,ajax,sdk,firefox-addon,mozilla,firefox-addon-sdk,Ajax,Sdk,Firefox Addon,Mozilla,Firefox Addon Sdk,我正在编写一个密码管理器,我的扩展在PageReady上创建了一个监听器,所以在浏览了几个URL之后,我就有了一堆监听器。我想响应用户单击“提交”表单按钮而不同时激活多个侦听器,因此我想分离内容脚本 现在它侦听表单提交,然后检查下一个加载的页面是否有“错误密码”之类的内容,然后执行其他操作。下面是我附加侦听器的代码: tabs.on("ready", function(tab) { fillLoginAndPass(tab); listenForLoginSubmit(tab);

我正在编写一个密码管理器,我的扩展在PageReady上创建了一个监听器,所以在浏览了几个URL之后,我就有了一堆监听器。我想响应用户单击“提交”表单按钮而不同时激活多个侦听器,因此我想分离内容脚本

现在它侦听表单提交,然后检查下一个加载的页面是否有“错误密码”之类的内容,然后执行其他操作。下面是我附加侦听器的代码:

tabs.on("ready", function(tab) {
    fillLoginAndPass(tab);
    listenForLoginSubmit(tab);
});

function listenForLoginSubmit(tab) {
    // attach submit listener 
    worker = tab.attach({
        contentScriptFile: [data.url("jquery-1.11.1.min.js"), data.url("listener-script.js")]
    });

    worker.port.on("submittedCredentials", function (formSubmitURL, enteredLogin, loginField, enteredPassword, passwordField) {
        tab.on("ready", function() {
            checkLogin(tab, formSubmitURL, enteredLogin, loginField, enteredPassword, passwordField);
        });
    });
}
我尝试过使用worker.destroy(),但没有效果-port.on()脚本仍然执行多次。还有别的办法吗?提前谢谢

编辑

为了澄清,这就是我的代码在worker.destroy()中的样子:

而产出的差异是:

// without worker.destroy()
/* Log in to wikipedia.org */
console.log: passman: Hello!

/* Log out, return to login page */
/* Log in a second time */
console.log: passman: Hello!
console.log: passman: Hello!
console.log: passman: Worker detached from https://en.wikipedia.org/w/index.php?title=Special:Search&search=&go=Go

// with worker.destroy()
/* Log in to wikipedia.org */
console.log: passman: Hello!
console.log: passman: Worker detached from https://en.wikipedia.org/w/index.php?title=Special:Search&search=&go=Go

/* Log out, return to login page */
/* Log in a second time */
console.log: passman: Hello!
console.log: passman: Worker detached from https://en.wikipedia.org/w/index.php?title=Special:Search&search=&go=Go
console.log: passman: Hello!
console.log: passman: Worker detached from https://en.wikipedia.org/w/index.php?title=Special:Search&search=&go=Go
如果我第三次这样做,我会得到3个“你好”,以此类推。再次感谢您提供的帮助

编辑2 评论中的bug报告Zer0链接给出了答案。这是:

let { off } = require("sdk/event/core");
off(worker.port);
let { off } = require("sdk/event/core");
off(worker.port);

我不得不说我没有尝试过这个想法,但正如任何人回答的那样,也许它可以帮助你:据我所知,内容脚本是通过worker添加的。因此,您可以尝试使用一个新的工作线程(没有内容脚本)覆盖该工作线程:


或者,您可以使用listener-script.js空白文件或覆盖该内容脚本中定义的类的代码来覆盖该文件。希望它能工作或抛出新的想法

这个问题的答案已经过时了,既然没有其他人写过,我会的。评论中的bug报告Zer0链接给出了答案。这是:

let { off } = require("sdk/event/core");
off(worker.port);
let { off } = require("sdk/event/core");
off(worker.port);

这很奇怪<代码>工作者。销毁应该有一些效果。我提交了以下内容。试着读一下这个主题,可能会有帮助,也许,我不确定感谢您创建错误报告,ZER0。为了澄清,worker.destroy()确实激活了onDetach:函数,但没有删除contentscript。我对我的问题进行了编辑,将其包括在内@诺伊蒂达特:谢谢。不幸的是,这不起作用。它似乎已经附加到页面顶部,每次加载一次。事实上,我正在加载多个页面,这导致它堆积起来。