无法解析xmlHttpRequest responseText在Firefox扩展中
我正在构建一个firefox扩展,并且在扩展中我正在做一个ajax请求,它返回一个responseText,现在我想解析js中的responseText,但我无法解析该请求。无法解析xmlHttpRequest responseText在Firefox扩展中
请注意,如果我在我的网络服务器上运行相同的代码,那么它完美的作品。下面是代码
var myHTML = XHR.responseText;
var tempDiv = document.createElement('div');
tempDiv.innerHTML = myHTML;
tempDiv.childNodes;
tempDiv.getElementsByTagName('a'); // etc. etc.
如果我在我的网络服务器使用此代码,然后我可以解析的childNodes和检索它们的值,但如果我在Firefox扩展使用相同的代码,那么我不能够访问childNodes,尽管我可以在firefox扩展中使用它时看到responseText。
我对这个无所谓的相同代码的行为有点困惑,请帮我解决。
innerHTML
setter的行为取决于您所处的文档类型。Firefox chrome是一个XML文档,因此myHTML
字符串将在上面的代码片段中被解析为XML。在网页中,您可能正在编写HTML,而不是XML,因此需要进行HTML解析。你的字符串碰巧是正确的HTML但不是格式良好的XML?
您最好不要将您从远程服务器收到的HTML代码直接插入您的特权文档 - 这是一个安全漏洞。即使您控制了服务器,并且您确信服务器永远不会被黑客入侵,但数据可能会在途中发生变化。通过使用innerHTML,您可以运行随HTML代码一起发送的JavaScript代码,并且JavaScript代码将以您的扩展特权执行(意味着它几乎可以做任何事情)。
您应该改为创建,并确保文档和该框架之间存在安全边界(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');
编辑:事情改变了我写这之后 - 火狐10的,你还可以使用DOMParser()
对于不能很好地形成的HTML代码。所以如果你只需要从一段HTML代码中提取一些数据,那么你不应该使用框架,而应该使用parseFromString(..., "text/html")
。
感谢您的建议。是的,我的字符串是一个HTML,但没有形成良好的XML。因此,你的意思是如果我的字符串格式良好的XML,那么我将能够解析我的Firefox扩展。但是如果我想在Firefox扩展中解析字符串为html?请让我知道如何解析在Firefox中通过xmlHttpRequest返回的html字符串? – 2011-06-03 04:59:50
你可以创建一个'