Firefox アドオン SDK (私の理解では以前は Jetpack と呼ばれていました) を理解しようとしていますが、DOM の操作に問題があります。
Web ページの読み込み時に 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>
...この Javascript ファイルを HEAD セクションに含めて、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」部分を削除するように変更)からpage-mod コンテンツ スクリプトとして使用すると、問題が発生します。「cfx run」を使用してアドオンをインストールした Firefox を起動し、同じ HTML ドキュメント (test.js ファイルの「script」部分をコメント化して) を開くと、アラートがまったく表示されません。
それが最初のパズルです。しかし、他の Web ページ (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 ドキュメント内のスクリプト。誰でもこれに光を当てることができますか?
前もって感謝します。