如何在Firefox扩展程序中将HTML字符串转换为DOM对象?

时间:2020-03-05 18:38:08  来源:igfitidea点击:

我正在下载一个带有XMLHttpRequest的网页(标记汤HTML),我想获取输出并将其转换为一个DOM对象,然后可以对其运行XPATH查询。如何从字符串转换为DOM对象?

看来,一般的解决方案是创建一个隐藏的iframe,然后将字符串的内容放入其中。一直有关于更新DOMParser以支持text / html的讨论,但是自Firefox 3.0.1起,如果尝试仍会得到NS_ERROR_NOT_IMPLEMENTED。

除了使用隐藏的iframe技巧外,还有其他选择吗?如果不是,那么执行iframe技巧的最佳方法是什么,以使代码在任何当前打开的标签页的上下文之外运行(以便关闭的标签页不会弄乱代码等)?

这是为什么我要寻找除iframe hack以外的解决方案的一个示例,如果我必须编写所有代码以拥有可靠的解决方案,那么我宁愿继续寻找其他解决方案。

解决方案

回答

试试这个:

var request = new XMLHttpRequest();

request.overrideMimeType( 'text/xml' );
request.onreadystatechange = process;
request.open ( 'GET', url );
request.send( null );

function process() { 
    if ( request.readyState == 4 && request.status == 200 ) {
        var xml = request.responseXML;
    }
}

注意overrideMimeType和responseXML。
" readyState == 4"已完成。

回答

尝试创建一个div

document.createElement( 'div' );

然后将标记汤HTML设置为div的innerHTML。浏览器应将其处理为XML,然后可以对其进行解析。

The innerHTML property takes a string
  that specifies a valid combination of
  text and elements. When the innerHTML
  property is set, the given string
  completely replaces the existing
  content of the object. If the string
  contains HTML tags, the string is
  parsed and formatted as it is placed
  into the document.

回答

因此,我们想使用javascript将网页下载为XML对象,但又不想使用网页?由于我们无法控制用户的操作(关闭选项卡或者窗口或者其他操作),因此需要像OSX仪表板小部件或者某些单独的应用程序那样进行操作。 Firefox扩展也可以使用,除非我们不必担心用户关闭浏览器。

回答

Ajaxian实际上在今天从iframe插入/检索html上发表了一篇文章。我们可能可以使用他们在此处发布的js代码段。

至于处理浏览器/选项卡的关闭,我们可以添加到onbeforeunload(http://msdn.microsoft.com/zh-cn/library/ms536907(VS.85).aspx)事件并执行所需的任何操作。

回答

Is there any option besides using the hidden iframe trick?

不幸的是,不,不是现在。否则,我们指向的微观摘要代码将改为使用它。

And if not, what is the best way to do the iframe trick so that your code works outside the context of any currently open tabs (so that closing tabs won't screw up code, etc)?

我们引用的代码使用最近的浏览器窗口,因此关闭选项卡不会影响解析。关闭该浏览器窗口将中止负载,但是我们可以处理它(例如,检测到该负载已中止并在另一个窗口中重新启动),这种情况很少发生。

我们需要一个DOM窗口才能使iframe正常工作,因此目前尚无干净的解决方案(如果我们热衷于使用mozilla解析器)。