我正在尝试使用 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中打开它,“alert”显示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 文件中的 page-mod内容脚本时,会出现问题(修改为删除“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文档中的脚本。任何人都可以对此有所了解吗?
提前谢谢。
答案 0 :(得分:2)
您的lib代码和contentScripts中的错误通常会记录到错误控制台。检查那里打印的是什么。另请参阅SDK控制台模块。
您的page-mod不会运行,因为默认情况下,page-mods仅在load事件之后运行。
请参阅contentScriptWhen
文档。
脚本标记实际上通常有一个包含内联脚本源的文本节点子项。因此,列举这些也是绝对正常的。
有关步行树节点的一些讨论,请参阅:getElementsByTagName() equivalent for textNodes
但是,如果您在特定ID /类的文本之后,请考虑使用document.querySelector/.querySelectorAll
,或者如果您在具有特定XPath的节点之后,请使用document.evaluate
。这很可能会快得多。
除此之外,我无法确切地说出你剩下的问题到底是什么,以及你在第一时间想要实现的目标,所以我无法就此提出建议。
答案 1 :(得分:1)
你想知道
我发现当文档出现时我的附加组件没有被执行 通过文件访问 - >打开文件。
这是设计上的。在match-pattern,它说
单个星号将任何URL与http,https或ftp方案匹配。 对于其他方案,如文件,资源或数据,请使用随后的方案 用星号表示,如下所示。
您可以使用正则表达式/.*/
来匹配所有网站和所有模式。