打印以后发现是这样访问的:iframe里面,window.widow.VAL
但是window里面包含了非常多层,这是什么原因?
即我在父页面的window挂一个变量VAL
window.VAL = 1
那么在父页面里面的iframe访问VAL可以通过:window.widow.VAL/window.widow.window.VAL。
为什么window一直包含window?
打印以后发现是这样访问的:iframe里面,window.widow.VAL
但是window里面包含了非常多层,这是什么原因?
即我在父页面的window挂一个变量VAL
window.VAL = 1
那么在父页面里面的iframe访问VAL可以通过:window.widow.VAL/window.widow.window.VAL。
为什么window一直包含window?
一、同源环境
1、首先在父页面获取iframe中的window,然后获取元素,根据window,不仅可以获取元素,还能调用里面的方法,前提是绑定在window上面
var ifW = $('#ifr')[0].contentWindow;
ifW.document.getElementsByClassName('wrap')
2、在iframe中获取父页面的window
1
window.parent
3、那么问题来了。这里有些人可能发现,获取元素的时候,根本获取不到,或者有时候有,有时候没有,很奇怪。。。其实呢,这是因为你引入iframe的时候,不能确定iframe是否加载完成,另外具体是iframe里面的js先执行,还是父页面的js先执行,也是个问题。既然问题找到了,那就可以给
ifW.document.getElementsByClassName('wrap')
这句代码加个延时,或者写在点击事件里面,等点击触发才去获取,这个时候就没有问题了
二、非同源
可以使用 HTML5的api , window.postMessage
在 iframe 里面,向父页面发送消息
1
window.top.postMessage("close",'*');
在父页面,,监听消息
1
2
3
4
window.addEventListener("message", function(event){
var origin = event.origin || event.originalEvent.origin;
}, false);
当然也可以在 iframe里面监听事件, 父页面发送消息
13 回答12.8k 阅读
7 回答2k 阅读
4 回答1.3k 阅读✓ 已解决
4 回答1.2k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答2.5k 阅读✓ 已解决
如果是父子级关系
假如我在父页面定义一个变量
var value=1
子页面可以直接通过
parent.value 获取父页面的这个变量
注意的是 父页面的定义的变量必须是全局的
window不知道,但应该也可以根据这种方法套,
比如parent.$("#id")