我正在构建一个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扩展中使用相同的代码,那么我无法访问childNodes,即使我可以看到responseText时我在firefox扩展中使用它。
我对同一代码的这种漠不关心的行为感到有点困惑,请帮帮我。
答案 0 :(得分: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")
。
答案 1 :(得分:0)
innerHTML
setter的行为取决于您所处的文档类型.Firefox chrome是一个XML文档,因此myHTML
字符串将在上面的代码段中解析为XML。在网页中,您可能正在编写HTML而不是XML,因此需要进行HTML解析。你的字符串是否恰好是HTML而不是格式良好的XML?