2012-03-28 44 views
0

我正在編寫瀏覽器擴展/加載項,它遍歷網頁的完整html樹。本質上,我使用node.childNodes獲取每個節點的子節點,然後遞歸調用遍歷函數。這很好,直到我碰到一個iframe。即使iFrame包含內容,但node.childNodes始終將iframe顯示爲具有0個子項。javascript,遍歷html樹:iframe

我見過如何處理這個問題的例子(例如http://pietschsoft.com/post/2004/08/12/JavaScript-How-to-get-value-from-nested-form-in-iframe.aspx),但是這些例子都假設我知道iframe的名字或者id。但是,iframe可能沒有名稱或ID,只是一個src。

+0

看起來這是一個跨域問題。這可能有所幫助:http://stackoverflow.com/questions/729577/can-javascript-access-iframe-elements-from-the-parent-page – 2012-03-28 14:58:16

回答

2

您可以通過檢查node.tagName == "IFRAME"來確定節點是iframe。

如果是這樣,那麼代替尋找node.childNodes,您會看到node.contentDocument.documentElement

應該相當簡單。

+0

這是:)我做到了:element.contentDocument.documentElement.childNodes – user984003 2012-03-28 15:09:30

+0

啊,但它並不總是工作。我有時會得到那個node.contentDocument是未定義的。我從詹姆斯希爾的回答中看到,獲取iframe的內容並不總是可能的。我不確定爲什麼它是一個安全「同源問題」,因爲我只是試圖讀取已經發送到我的瀏覽器的html。畢竟,當我點擊Chrome中的「檢查元素」時,我可以看到它。 – user984003 2012-03-28 18:46:39

+0

Inspector受瀏覽器信任(因爲它*就是瀏覽器)。但是,你的代碼不是。因此,如果iframe包含來自其他域的內容,則無法訪問iframe的內容。 – 2012-03-28 19:00:17

0

如果要遍歷iFrame中的所有元素,則需要訪問iFrame的document對象。

if(currentElement == iframe) { 
    TraverseDOM(currentElement.contentDocument.documentElement); 
} 

注:如果iFrame的內容是不同的域起源,你將不能訪問它的內容。請參閱Same Origin Policy

+1

@JamesHill,如果可以的話,我會投你一票,但我不能(因爲我是你)。 – 2012-03-28 16:25:51