【问题标题】:Firefox addon SDK and DOM manipulation problemsFirefox 插件 SDK 和 DOM 操作问题
【发布时间】:2013-08-05 16:13:44
【问题描述】:

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

提前谢谢你。

【问题讨论】:

    标签: javascript firefox firefox-addon-sdk


    【解决方案1】:

    你想知道

    我发现我的插件在文档被执行时没有被执行 通过 File->Open File 访问。

    这是设计使然。在match-pattern,它说

    单个星号匹配任何带有 http、https 或 ftp 方案的 URL。 对于文件、资源或数据等其他方案,请使用遵循的方案 用星号表示,如下所示。

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

    【讨论】:

    • 谢谢 - 我仍然需要回到这个并完成我的项目的那部分,所以了解这一点非常有用。
    【解决方案2】:

    您的 lib 代码和 contentScripts 中的错误通常会记录到错误控制台。检查那里打印的内容。另请参阅 SDK 控制台模块。

    您的页面模块不会运行,因为默认情况下页面模块只会在加载事件之后运行。 请参阅contentScriptWhen 文档。

    脚本标签实际上通常有一个包含内联脚本源的文本节点子节点。因此,这些也被枚举是绝对正常的。

    有关行走树节点的一些讨论,请参阅:getElementsByTagName() equivalent for textNodes 但是,如果您要查找特定 id/类的文本,请考虑使用 document.querySelector/.querySelectorAll,或者如果您要查找具有特定 XPath 的节点,请使用 document.evaluate。这很可能会快很多。

    除此之外,我无法真正说出您的剩余问题到底是什么,以及您首先要达到的目标是什么,因此我无法就此提供建议。

    【讨论】:

    • 您好,非常感谢您的回复。我的回复有点晚了,因为我想在跟进之前做更多的实验。首先,关于我遇到的问题,我的测试 HTML 文件中没有一个文本节点被枚举 - 我发现当通过 File->Open File 访问文档时我的插件没有执行。
    • 我不确定这是否是设计使然,但这似乎不太可能是疏忽。当我将测试文件上传到我的主机并从那里访问它时,文本节点按预期显示。
    • 其次,我发现我期望在 YouTube 视频页面上找到的文本值“混杂在一起”的原因是这些值的第一个实例存储在 JSON 响应中DOM(据我所知)。此外,由于页面的“AJAX”性质,这些文本值的可见事件丢失了——我的节点枚举发生在这些值被添加到页面之前,所以它丢失了它们。现在我观察文档更改并在检测到更改时重新运行枚举。
    • 我的 JQuery AJAX 请求遇到了严重的问题。这个 StackOverflow 问题给了我一些提示(我可能会就此提出一个新问题):stackoverflow.com/questions/7973643/… 有很多问题,我对我的解决方案并不完全满意。首先,我不能让 JQuery 为我自动处理回调,因为它对“窗口”的引用不是“真正的”窗口,并且回调失败。
    • 顺便说一句,我不能用积分“感谢”你,因为我没有足够的“声誉”,但我很感谢你的回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多