无法解析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?

+0

感谢您的建议。是的,我的字符串是一个HTML,但没有形成良好的XML。因此,你的意思是如果我的字符串格式良好的XML,那么我将能够解析我的Firefox扩展。但是如果我想在Firefox扩展中解析字符串为html?请让我知道如何解析在Firefox中通过xmlHttpRequest返回的html字符串? – 2011-06-03 04:59:50

+0

你可以创建一个'

您最好不要将您从远程服务器收到的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")