2011-05-29 117 views
48

我有一個跨域網站的iframe。我想讀取iframe的DOM,我相信這是可能的,因爲使用檢查器,我甚至可以修改iframe的DOM。我嘗試閱讀它的每一種方式,但是,我遇到了相同的原產地政策。我想要的是從iframe中加載的本地DOM中的內容。我認爲它會像$(document.body).find('iframe').html()一樣簡單,但是這是返回空字符串。獲取跨域iframe的DOM內容

我真的很希望有一種方法可以做到這一點,因爲過去幾天我一直在做的工作已經被預測爲可行。

感謝

+2

葉s,你可以做到這一點 - 見http://stackoverflow.com/a/17262334/888177 – Stefan 2013-06-23 16:46:05

回答

56

你不能。 XSS protection。跨站點內容無法通過JavaScript讀取。沒有主要的瀏覽器會允許你。我很抱歉,但這是一個設計缺陷,你應該放棄這個想法。

編輯

請注意,如果您有編輯訪問加載到iframe中的網站,你有兩個選擇:

  1. 使用postMessage(另見browser compatibility

  2. CORS headers:只需將以下標題添加到iframed網站:

Access-Control-Allow-Origin: http://foo.example

其中http://foo.example是承載網頁在它

+8

如果你的意思是設計(流程)缺陷,那麼不,這不是缺陷,這是爲了安全而實施的。 – Ibu 2011-05-29 23:08:56

+12

我知道它是出於安全原因而實現的,我的意思是基於這個概念的設計缺陷(thx)。 – SinistraD 2011-05-29 23:30:50

+2

在這種情況下,我誤解了然後 – Ibu 2011-05-29 23:32:16

6

如果你有機會你可以使用類似easyXDM使在iframe函數調用和返回數據的iFrame網頁。

如果您無法訪問iframed頁面,則必須使用服務器端解決方案。 使用PHP,你可以做一些快速和骯髒的,如:

<?php echo file_get_contents('http://url_of_the_iframe/content.php'); ?> 
+0

我沒有訪問iframed頁面和服務器端解決方案几乎沒有問題,因爲我使用cocoahttpserver(服務器運行在iPhone上) – 2011-05-29 22:56:02

+0

在這種情況下,這是不可能的。有關更多詳細信息,請參見http://en.wikipedia.org/wiki/Same_origin_policy。 – devmatt 2011-05-29 23:06:19

+1

你先生是一個學者和紳士 – user1775598 2014-05-15 09:22:01

-3

的iframe域有一個變通方法來實現它。

  1. 首先,將您的iframe綁定到具有相對url的目標頁面。瀏覽器會將該網站的iframe與您的網站視爲同一個域名。

  2. 在您的Web服務器中,使用重寫模塊將請求從相對url重定向到絕對url。如果您使用IIS,我建議您檢查IIRF module

+0

你的意思是服務器發送http重定向到國外位置?如果是這樣,它至少在Firefox 9中不起作用。我假設其他瀏覽器不會被這個或者 – 2012-01-31 07:11:07

4

如果您有權訪問加載的域/ iframe,則可以使用window.postMessage在iframe和主窗口之間進行通信。

在iframe中使用JavaScript讀取DOM,並通過postMessage將其發送到頂部窗口。

此處瞭解詳情:https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

+0

所迷惑我們如何使用js讀取iframe中的DOM?這是可能的,不是嗎? – 2016-12-03 12:36:04

+0

你像往常一樣閱讀DOM。例如document.getElementsByTagName(「BODY」)[0];之後,使用window.postMessage將剛剛在iframed窗口中讀取的DOM對象發送到託管iframe窗口的窗口。 – 2016-12-04 17:25:57

6

有一個簡單的方法。

  1. 創建具有源像「http://your-domain.com/index.php?url=http://the-site-you-want-to-get.com/unicorn

  2. 然後一個iframe,你剛剛得到這個URL以$ _GET與的file_get_contents顯示內容($ _ GET [ '鏈接']);

您將得到具有比你同一個域的iframe,那麼你就可以使用$(「IFRAME」)。內容()。找到(「身體」)來操作內容。

+1

你能否解釋一下細節。非常感謝@@ – bfhaha 2016-03-24 15:50:44

+1

對不起,遲到了,我沒有注意到。 1.創建一個php頁面,顯示您想要從GET參數中獲得的頁面內容。 content.php '<?php echo file_get_contents($ _ GET ['url']); ?> 2.然後,在您的主頁中添加一個將加載此頁面的iframe。 '