javascript-Firefox插件SDK和DOM操作问题
作者:互联网
我正在尝试使用Firefox插件SDK(据我所知以前称为Jetpack),但是在使用DOM时遇到了问题.
加载网页时,我需要遍历DOM中的所有文本节点,并对它们包含的某些字符串进行更改.我在下面发布了我正在做的事情的简化版本(是Javascript的新功能,因此请原谅我).
// test.js
function parseElement(Element)
{
if (Element == null)
return;
var i = 0;
var Result = false;
if (Element.hasChildNodes)
{
var children = Element.childNodes;
while (i <= children.length - 1)
{
var child = children.item(i);
parseElement(child);
i++;
}
}
if (Element.nodeType == 3)
{
// For testing - see what the text node contains
alert(Element.nodeValue);
Result = true;
}
return Result;
}
window.addEventListener("load", function load(event)
{
window.removeEventListener("load", load, false);
parseElement(document.body);
}
当我创建基本的HTML文档时:
<!-- test.html -->
<html>
<head>
<script type="text/javascript" src="test.js"></script>
</head>
<body>
<b>hello world</b>
<p>foo</p>
<i>test</i>
</body>
</html>
…在HEAD部分中包含此Javascript文件,然后在Firefox中打开它,“警告”显示6个对话框,其中包含:
1) "hello world"
2) blank -> no visible characters, just a newline
3) "foo"
4) blank -> no visible characters, just a newline
5) "test"
6) blank -> no visible characters, just a newline
正是我期望看到的.
当我创建一个插件并将test.js用作main.js文件中的页面修改内容脚本时,就会出现问题(已修改为删除“ addEventListener”部分).当我使用“ cfx run”启动安装了我的插件的Firefox,然后打开相同的HTML文档(对test.js文件的“ script”部分进行了注释)时,警报根本不显示.
这是第一个难题.但是,在导航到其他网页(例如YouTube视频页面)后,警报确实显示了多个对话框,但它们包含非常奇怪的字符串,主要是脚本标签的内容:
编辑我没有足够的声誉来嵌入图像,因此,这里有一个链接代替显示了我的意思:http://img46.imageshack.us/img46/5994/mtpd.jpg
再次,我希望看到的文本不存在.
为下面的一些冗余而道歉,但要清楚一点:这是我的main.js:
main.js
var data = require("sdk/self").data;
var data = require("sdk/self").data;
exports.main = function()
{
pageMod.PageMod({
include: "*",
contentScriptFile: [data.url("test.js")]
});
}
Javascript文件的修改后的版本与上面列出的“ test.js”相同,但是在最后一部分:
test.js
<snip>
...
return Result;
}
parseElement(document.body);
我已经将我的项目文件(如果可以叫它们的话)包含在一个zip中,如果它使事情更容易可视化:http://www.mediafire.com/?774iprbngtlgkcp
我尝试改变
parseElement(document.body);
至
parseElement(unsafeWindow.document.body);
以防万一,但结果是相同的.
所以我对发生的事情感到非常困惑.当我将它用作插件的一部分时,我无法理解为什么test.js文件没有从DOM中选择文本节点(而且仅文本节点),但是当作为附件包含在其中时,我的预期与我预期的完全一样HTML文档中的脚本.谁能对此有所启示?
先感谢您.
解决方法:
您的lib代码和contentScript中的错误通常记录到错误控制台中.检查那里打印了什么.另请参见SDK控制台模块.
您的page-mod将不会运行,因为默认情况下,page-mod将仅在load事件之后运行.
请参阅contentScriptWhen
文档.
脚本标签实际上通常具有包含嵌入式脚本源的文本节点子级.因此,将这些枚举也绝对是正常的.
有关步行树节点的一些讨论,请参见:getElementsByTagName() equivalent for textNodes
但是,如果您使用的是特定ID /类的文本,请考虑使用document.querySelector/.querySelectorAll
,或者如果您使用的是具有特定XPath的节点,请使用document.evaluate
.这很有可能会更快.
除此之外,我真的无法确切地说出您剩下的问题到底是什么,以及您首先要实现的目标,因此我无法就此提出建议.
标签:firefox,firefox-addon-sdk,javascript 来源: https://codeday.me/bug/20191122/2063762.html