同域或跨子域读写操作 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" οnclick="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
由于前端解决跨域问题的局限性比较大,所以最好用 服务器端解决方案。