【问题标题】:Not able to parse xmlHttpRequest responseText in a firefox extension无法在 firefox 扩展中解析 xmlHttpRequest responseText
【发布时间】:2011-06-01 03:37:44
【问题描述】:

我正在构建一个 firefox 扩展,并且在扩展中我正在发出一个 ajax 请求,它返回一个 responseText,现在我想解析 js 中的 responseText,但我无法解析该请求。

请注意,如果我在我的网络服务器上运行相同的代码,那么它可以完美运行。下面是代码

var myHTML = XHR.responseText;
var tempDiv = document.createElement('div');

tempDiv.innerHTML = myHTML;
tempDiv.childNodes;
tempDiv.getElementsByTagName('a'); // etc. etc.

如果我在我的网络服务器上使用此代码,那么我可以解析 childNodes 并检索它们的值,但是如果我在我的 firefox 扩展中使用相同的代码,那么即使我可以看到 responseText,我也无法访问 childNodes我在 Firefox 扩展中使用它。

我对同一代码的这种冷漠行为感到有些困惑,请帮助我。

【问题讨论】:

    标签: parsing firefox responsetext


    【解决方案1】:

    您最好不要将您从远程服务器收到的 HTML 代码直接插入到您的特权文档中 - 这是一个安全漏洞。即使您控制服务器并且您绝对确定服务器永远不会被黑客入侵,数据也可能在途中被更改。通过使用 innerHTML,您可以运行与 HTML 代码一起发送的 JavaScript 代码,并且该 JavaScript 代码将以您的扩展程序的权限执行(这意味着它几乎可以做任何事情)。

    您应该创建一个<iframe>,并确保您的文档和该框架之间存在安全边界(type="content" 就是这样做的)。像这样的:

    var myHTML = XHR.responseText;
    var tempFrame = document.createElement("iframe");
    tempFrame.setAttribute("type", "content");
    tempFrame.setAttribute("src", "data:text/html;charset=utf-8," + encodeURIComponent());
    document.documentElement.appendChild(tempFrame);
    tempFrame.contentWindow.addEventListener("load", function()
    {
        tempFrame.contentDocument.documentElement;
        tempFrame.contentDocument.getElementsByTagName('a');
        ...
        tempFrame.parentNode.removeChild(tempFrame);
    }, false);
    

    如果您拥有格式良好的 XML,事情当然会更容易。然后解析它只是一个问题:

    var doc = new DOMParser().parseFromString(XHR.responseText, "text/xml");
    doc.documentElement;
    doc.getElementsByTagName('a');
    

    编辑:在我写完这篇文章后情况发生了变化——从 Firefox 10 开始,您还可以将 DOMParser() 用于格式不正确的 HTML 代码。因此,如果您只需要从一段 HTML 代码中提取一些数据,那么您不应该使用框架,而应该使用 parseFromString(..., "text/html")

    【讨论】:

      【解决方案2】:

      innerHTML setter 的行为取决于您所在的文档类型。Firefox chrome 是一个 XML 文档,因此在上面的 sn-p 中,myHTML 字符串将被解析为 XML。在网页中,您可能正在编写 HTML,而不是 XML,因此需要进行 HTML 解析。您的字符串是否恰好是 OK HTML 但不是格式良好的 XML?

      【讨论】:

      • 感谢您的建议。是的,我的字符串是 HTML,但不是格式良好的 XML。因此,您的意思是如果我的字符串是格式良好的 xml,那么我将能够在我的 firefox 扩展中进行解析。但是,如果我想在 firefox 扩展中将字符串解析为 html 怎么办?请让我知道如何解析通过 xmlHttpRequest 在 firefox 扩展中返回的 html 字符串?
      • 您可以创建一个 <iframe> 并在其中加载一个 HTML 文档(about:blank 可以),然后在其中创建一个元素并在其上设置 innerHTML。这可能是你最好的选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多