【发布时间】:2014-05-20 15:36:13
【问题描述】:
我正在使用 Firefox addon-sdk 开发一个小型扩展,它必须更改页面中 DOM 元素的内容。我正在使用PageMod 添加内容脚本并注册一些事件,其中一些我想将回调函数传递给,如下所示:
main.js
pageMod.PageMod({
include: "*",
contentScriptWhen: 'ready',
contentScriptFile: [self.data.url("my_content_script.js")],
onAttach: function(worker) {
worker.port.on("processElement", function(elementSrc, callback) {
doSomeProcessingViaJsctypes();
callback("http://someUrl/image.png");
});
}
});
my_content_script.js
var elements = document.getElementsByTagName("img");
var elementsLength = elements.length;
for (var i = 0; i < elementsLength; i++)
{
(function(obj) {
obj.setAttribute("data-processed", "true");
self.port.emit("processElement", obj.src, function(newSrc) {
console.log("replaced " + obj.src);
obj.src = newSrc;
});
})(elements[i]);
}
错误
TypeError: callback is not a function
Stack trace:
.onAttach/<@resource://gre/modules/XPIProvider.jsm -> file:///c:/users/sebast~1/appdata/local/temp/tmpjprtpo.mozrunner/extensions/jid1-gWyqTW27PXeXmA@jetpack/bootstrap.js -> resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-gwyqtw27pxexma-at-jetpack/testextension/lib/main.js:53
我似乎无法在网上找到任何关于此事的信息。我需要这种方法,因为处理需要一些时间并且依赖于 .dll 文件,所以我不能从内容脚本中调用它。
如果我要处理元素,然后调用worker.port.emit(),我将不得不再次遍历整个树以识别元素并更改它的src 属性。这将花费很长时间,并且会为文档中的每个 img 添加额外的循环。
我考虑过生成一个唯一的类名并将其附加到元素的类中,然后调用getElementsByClassName()。我没有对此进行测试,但在我看来,这将花费与我上面描述的过程相同的时间。
任何建议将不胜感激。
编辑:我在另一个问题上找到了this answer。 Wladimir Palant 建议使用window-utils 来获取activeBrowserWindow,然后彻底迭代它是content。
他也提到了
这些低级 API 不能保证稳定,window-utils 模块甚至没有完整的文档记录
从那以后有什么变化吗?我想知道您是否可以使用选项卡获得相同的content 属性,以及您是否可以识别工作人员发送self.port.emit() 的选项卡。
【问题讨论】:
标签: javascript firefox firefox-addon firefox-addon-sdk