问题需求:父页面与子页面iframe跨域嵌套,子页面要触发父页面所定义的js方法、父子页面的数据传递。
下文中会用到一些文件:
父页面: parent.html
嵌在父页面的子iframe页面:child.html
#同域时 iframe 调用父页面的JS方法
在同域的情况下,子iframe页面可以很方便地直接调用父页面定义的JS方法:
window.parent.fn(); 或者 window.top.fn();
window.self: 当前窗口自身的引用
window.parent: 上一级父窗口的引用
window.top: 最顶层窗口的引用
当页面中不存在 iframe 嵌套时,则 window.self, window.parent, window.top 三者均是当前窗口自身的引用。
比如,parent.html 和 child.html 均在 a.com 的同一域名下,
parent.html 代码:
child.html 代码:
当 iframe 的链接与父页面不同域时,则子页面的 iframe 不能调用父页面定义的方法,会报错;
如:parent.html 在 a.com 域名下,但子 iframe 的链接与 a.com 不同域:
实际上,跨域直接调用其它页面所定义的JS方法是做不到的。
#postMessage 的发送与接收
Window.postMessage 是 HTML5 提供的一个跨域解决方案。基本的发送和接收使用如下:
发送:
otherWindow.postMessage(message, targetOrigin, [transfer]);
参数说明:
message: 将要发送到其他 window的数据;
otherWindow:其他窗口的一个引用,如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames;
targetOrigin: 通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串”*”(表示无限制)或者一个URI。
接收:
event 包含很多的信息,其中重要的几个分别是:
event.data :传递过来的信息,也就是 postMessage 中发出的 message;
event.origin: 发送信息页面的域名,包括协议和端口号。
#跨域时 iframe 触发父页面的JS方法,数据双向传输
a.com 域名下的父页面 parent.html 定义了功能函数 sayHi();
父页面 parent.html 中嵌套了子 iframe 页面 child.html(在域名b.com域名下) ;
现在要实现:
1)在child.html中引起触发、执行父页面定义的 sayHi()方法。
2)在child.html中向父页面请求获取数据 uname 值。
基本思路:
parent.html 和 child.html 2个页面分别设置发送和接收,如图:
1) child.html代码:
2) child.html 中引入的js文件 sdk_child.js 代码:
3) parent.html 中引入的js文件 sdk_parent.js代码: