嵌入 iframe 的頁面,父頁面與子頁面均可以很輕鬆的在同域或跨子域的情況下進行讀寫操作;在完全不同域的情況下,也可以通過更改 hash 的方式進行通訊。下面我在九個不同(版本的)瀏覽器中對此進行資料轉送與更改的相容性測試。
同域或跨子域讀寫操作 iframe 裡的內容
父頁面讀寫操作子頁面:
複製代碼 代碼如下:<iframe id="test-iframe" name="test-iframe" src="child.html" scrolling="no" frameborder="0"></iframe>
<script>
window.onload = function () {
/*
* 下面兩種擷取節點內容的方式都可以。
* 由於 IE6, IE7 不支援 contentDocument 屬性,所以此處用了通用的
* window.frames["iframe Name"] or window.frames[index]
*/
var d = window.frames["test-iframe"].document;
d.getElementsByTagName('h1')[0].innerHTML = 'pp';
alert(d.getElementsByTagName('h1')[0].firstChild.data);
}
</script>
註:在請務必通過 window.onload 方法訪問 iframe 中的節點,否則瀏覽器會提示錯誤-拒絕訪問。在 IE8, Firefox3.6, Opera11 下在DOMReady 時也可以訪問 iframe 中的節點。
子頁面讀寫操作父頁面:
複製代碼 代碼如下:<script>
parent.document.getElementsByTagName('h1')[0].innerHTML = 'pp';
alert(parent.document.getElementsByTagName('h1')[0].firstChild.data);
</script>
小結:
•1 測試通過 IE6, IE7, IE8, Firefox2.0, Firefox3.0, Firefox3.6, Chrome8, Opera11, Safari5.
•2 查閱資料得出 document.getElementById(‘id name').contentDocument 全等於 window.frames["iframe Name"].document.
•3 跨子域時,需要在父頁面和子頁面 JS 中分別加上 document.domain = 'xxx.com';
跨網域作業 iframe 裡內容
當兩個網頁所在域不同時,要實現資料的互相調用,只能通過 JS 改變 location 對象的 hash 屬性的值來做到互相通訊。
父頁面:
複製代碼 代碼如下:<iframe id="test-iframe" src="http://www.yyy.com/child.html" scrolling="no" frameborder="0"></iframe>
<input type="button" value="send" onclick="sendRequest()" />
<script>
function sendRequest() {
document.getElementById('test-iframe').src += '#a';
}
var interval = window.setInterval(function(){
if(location.hash) {
alert(location.hash);
window.clearInterval(interval);
}
},1000);
</script>
子頁面:
複製代碼 代碼如下:<h1>RRRRRR</h1>
<script>
var url = 'http://www.xxx.com/father.html';
oldHash = self.location.hash,
newHash,
interval = window.setInterval(function(){
newHash = self.location.hash;
if(oldHash != self.location.hash) {
document.getElementsByTagName('h1')[0].innerHTML = 'pp';
//alert(parent.location.href); //去掉這個注釋,瀏覽器會提示無許可權
parent.location.href = url + '#b';
window.clearInterval(interval);
}
},500);
</script>
小結:
•1 經測試 IE6, IE7, IE8, Firefox2.0, Firefox3.0, Firefox3.6, Chrome8, Opera11, Safari5, 除 IE6, IE7 外只要改變hash 就會記錄在瀏覽器 history 中。
•2 我有試圖在子頁面用 parent.location.replace 的方法來避免父頁面向伺服器發送請求而進行跳轉,這樣理論上瀏覽器就不會記錄曆史,但未能奏效。
•2 子頁面無權讀取父頁面的 url, 但可以對父頁面的 url 進行寫操作,所以跨網域作業時,要提前得知父頁面的url
由於前端解決跨域問題的局限性比較大,所以最好用伺服器端解決方案