0

我正在构建一个 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 扩展中。

我对相同代码的这种漠不关心的行为有点困惑,请帮帮我。

4

2 回答 2

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").

于 2011-06-06T19:19:31.557 回答
0

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

于 2011-06-01T04:15:47.473 回答