编程语言
首页 > 编程语言> > javascript-Firefox插件SDK和DOM操作问题

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