2012-08-15 75 views
4

一些背景:
我正在使用JavaScript开发基于Web的移动应用程序。 HTML渲染是基于Safari的。跨域策略被禁用,所以我可以使用XmlHttpRequests调用其他域。这个想法是解析外部HTML并获取特定元素的文本内容。
在过去,我一行一行解析文本,找到我需要的行。然后获取该行标签的内容。这非常麻烦,并且每次目标html更改时都需要进行大量维护。
所以,现在我想解析HTML文本到DOM中,并在其上运行css或xpath查询。
它运作良好:JavaScript中的DOM解析

$('<div></div>').append(htmlBody).find('#theElementToFind').text() 

唯一的问题是,当我使用浏览器加载HTML文本到DOM元素,它会尝试加载所有外部资源(图片,js文件等)。虽然它没有造成任何严重问题,但我想避免这种情况。

现在的问题是:
我如何解析HTML文本,以DOM没有浏览器中加载外部资源,或运行JS脚本?
一些想法,我一直在思考:

  • 创建使用createDocument调用(document.implementation.createDocument())新的文档对象,但我不知道它会跳过外部资源的加载。在JS
  • 使用第三方DOM解析器 - 这是唯一一个我试过很糟糕与处理错误
  • 使用iframe来创建新的文件,使之与相对路径外部资源不会在控制台
  • 抛出一个错误

回答

4

看来,下面这段代码的伟大工程:

var doc = document.implementation.createHTMLDocument(""); 
doc.documentElement.innerHTML = htmlBody; 
var text = $(doc).find('#theElementToFind').text(); 

外部资源未加载,脚本未被评估。

在这里找到: https://stackoverflow.com/a/9251106/95624

来源: https://developer.mozilla.org/en/DOMParser#DOMParser_HTML_extension_for_other_browsers

+0

很好,+1和喜欢。是否保证没有外部加载/脚本评估,或者它现在只是“正常工作”?如果这将在未来任何时候改变,它可能不是一个非常可靠的解决方案。 – pimvdb 2012-08-15 12:06:45

+0

这很好,但有一个问题,它不会复制HTML节点上的属性,但是它很小,因为它实现了上述问题的主要部分。 – joseeight 2013-02-20 07:47:03

1

您可以构建任何HTML字符串的jQuery对象,如果没有它附加到DOM:

$(htmlBody).find('#theElementToFind').text(); 
+0

这将仍然运行JavaScript。 – pimvdb 2012-08-15 09:40:29

+0

这将确实运行js并加载外部资源(图像,css等) – 2012-08-15 10:01:31