2012-02-20 44 views
6

所以我這樣做:getElementsByTagName('a');不工作?

var stuff = document.getElementsByTagName('iframe'); 

工作正常。然後我想這樣做:

var other = stuff.getElementsByTagName('a'); 

但它不起作用。它最終未定義。我可以這樣做:

var other = document.getElementsByTagName('a'); 

這很好。我應該無法在'iframe'中獲得所有'a'嗎?

編輯:所以我沒有自己的iframe,我現在的印象是我無法訪問iframe生成的任何東西,這意味着我猜我搞砸了。

+0

你是否擁有iframe? – Anurag 2012-02-20 04:38:51

+0

@Auurag不,我看到有人發佈了一個答案,說由於瀏覽器的安全性,你無法訪問這些信息,但他們刪除了它。我想你只能訪問實際的iframe部分,它產生的任何內容都是禁止的? – townie 2012-02-20 04:49:16

回答

2

getElementsByTagName返回匹配元素的數組。要訪問單個IFRAME,您將使用stuff[0]爲例。

10

使用..

var iframe = document.getElementsByTagName('iframe')[0], 
    iframeDoc = iframe.contentWindow.document; 

Specification

然後,您可以撥打電話getElementsByTagName('a')iframeDoc。或者,您可以訪問iframeDoc.links,這不完全相同,但可能是您想要的。

當然,這一切都依賴於訪問iframedocument不違反Same Origin Policy

+1

這是正確的。 getElementsByTagName是文檔上的一種方法,不在鏈接上。你試圖做到這一點的方式,你(鄉紳)試圖做到這一點是排序標籤的孩子。 – Chris 2012-02-20 04:42:02

+3

鑑於'iframe.contentDocument'在IE 8中不起作用,我只會選擇使用可以可靠跨瀏覽器工作的'iframe.contentWindow.document'。首先嚐試使用contentDocument沒有任何好處 - 只有代碼會更長。 – 2012-02-20 04:48:01

+1

@ReneSaarsoo是的,我想也許第二個是IE的做生意的禮儀方式,但規格提到了兩個。我會修復它:) – alex 2012-02-20 04:50:09

4

getElementsByTagName()返回一個NodeList,你需要迭代它。遍歷它,你可以這樣做:

for (var i = 0; i < stuff.length; i++) { 
    var other = stuff[i].getElementsByTagName('a'); 
} 

然而,getElementsByTagName('a')地詢問當前文件,這是幾乎可以肯定不是你想要的內兒。如果你想在框架中的文檔中的孩子,你需要做的:

for (var i = 0; i < stuff.length; i++) { 
    var other = stuff[i].contentWindow.document.getElementsByTagName('a'); 
} 

,如果你有多個iframe,並在舊版本的IE這將工作。

+4

它實際上不是一個數組。這是一個節點列表。 – 2012-02-20 04:41:20

+0

@MikeSamuel完全正確:) – 2012-02-20 04:50:08

3
stuff[0].contentWindow.document.getElementsByTagName('a') 

應該產生一個類似數組的對象,其中包含第零個iframe中的所有鏈接。

您需要使用contentWindow.document,因爲在當前文檔中不包含任何節點 - 它是一個框架,它的contentWindow屬性指向具有自己文檔的不同窗口。

0

爲什麼每個人都建議contentWindow.document當你只能使用contentDocument而不是?

當然,這兩個工作,但我更喜歡用我的意思。如果我想要窗戶,我使用contentWindow。如果我想要這個文件,我使用contentDocument

+0

顯然它不工作 alex 2012-03-23 00:08:54

相關問題