2012-08-15 39 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