3

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 ドキュメント内のスクリプト。誰でもこれに光を当てることができますか?

前もって感謝します。

4

2 に答える 2

2

lib コードと contentScript のエラーは通常、エラー コンソールに記録されます。そこに何が印刷されているかを確認してください。SDK コンソール モジュールも参照してください。

デフォルトでは、page-mod は load イベントの後にのみ実行されるため、page-mod は実行されません。contentScriptWhenドキュメントを参照してください。

script タグには、実際には、インライン スクリプト ソースを含む text-node の子が含まれていることがよくあります。したがって、それらも列挙されるのは絶対に正常です。

ツリー ノードのウォーキングに関する議論については、以下を参照してください: getElementsByTagName() は textNodes と同等 ただし、特定の ID/クラスのテキストを探している場合は の使用を検討するdocument.querySelector/.querySelectorAllか、特定の XPath を持つノードを探している場合は を使用してくださいdocument.evaluate。これにより、はるかに高速になる可能性が非常に高くなります。

それ以外は、あなたの残りの問題が正確に何であり、そもそもあなたが何を達成しようとしているのかを正確に伝えることができないので、それについてアドバイスすることはできません.

于 2013-08-05T22:54:20.507 に答える