我正在尝试使用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 文件中的 page-mod 内容脚本时出现问题(修改为删除“addEventListener”部分)。当我使用“cfx run”启动安装了我的插件的 Firefox,然后打开相同的 HTML 文档(test.js 文件的“脚本”部分已注释),警报根本不显示。
所以这是第一个谜题。但也导航到其他网页 - 例如,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 文档中的脚本。任何人都可以对此有所了解吗?
先感谢您。