Firefox插件SDK和DOM操作问题

时间:2013-08-05 02:52:58

标签: javascript firefox firefox-addon-sdk

我正在尝试使用 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文档中的脚本。任何人都可以对此有所了解吗?

提前谢谢。

2 个答案:

答案 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方案匹配。   对于其他方案,如文件,资源或数据,请使用随后的方案   用星号表示,如下所示。

您可以使用正则表达式/.*/来匹配所有网站和所有模式。