原文连接:Rockjins Blog跨域
上礼拜用postMessage进行iframe跨域通讯(使用postMessage解决iframe跨域通讯问题),由于写的代码不够健壮,其实说到底仍是了解的知识点不够多,这个礼拜BUG就提上来了...框架
我至关于开发一个中间层框架,在我外层有一个大框架用iframe
包着我,我再用iframe
包着另外一个页面,如图(配色好评):dom
按理说用postMessage
是不会出问题的:我负责父页面和子页面之间的通讯,他们把数据发送给我,我再替他们发送给对方。post
可是这几个框架又是相互独立的,只有在特定的情景下才会这样嵌套,BUG就是在页面独立时出现的。3d
咱们知道,获取父级iframe
最简单的方法就是window.parent
,这样能够拿到父级iframe
的window
对象,我大概就是这样发送postMessage
给父级iframe
的:code
parent.postMessage('someMessage', '*')
cdn
并且postMessage
方法的调用是写在onmessage
事件里的,也就是子页面发送消息过来,我监听到onmessage
事件,就发送消息给父级iframe
。对象
问题来了,以前说过框架以前均可以独立运行,若是没有父级iframe
,只剩下个人框架和子框架,会发生什么呢?blog
你们来开心一下,就是这样子:事件
并且最诡异的一点是,信息发起人的HOST
并非子页面,而是我本身?WTF?
我不信,跑去找子页面的开发负责人,问他是否是写了死循环不停发消息,对方很坦荡的把代码打开:“你本身看吧,哪来的死循环?”
好吧,回去本身找BUG,通过一个小时的埋头苦读,终于发现了问题所在。
我如今问你们一个问题:当你的页面处于最顶层,也就是外层没有iframe
包裹你,求这时window === window.parent
的返回值。
呵呵,竟然是true
,也就是说,当你的页面处于最顶层,window.parent
指向你本身!
有图为证:
至关于当你处于最顶层时,你儿子就是你本身,你也能够是本身的爷爷,固然也能够是本身的曾孙,大概就是这个意思,但愿你们之后不会遇到这个坑,其实也不算坑啦,说到底仍是本身知识面不够广,连轮回这么简单的道理都不明白...
本文做者:余震(Shock)
本文出处:Rockjins Blog
版权声明:本博客全部文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN许可协议。转载请注明出处!