我帮助开发了一个名为 Endpoint.js 的项目(在 npm 和 bower.io 上作为“endpointjs”),它能够通过 iframe、窗口、选项卡、浏览器、服务器进程等包装远程对象。它的工作原理与以及跨域。
同源
要做你想做的事,你可以这样做(在父母身上):
var adapter = window.endpoint.registerAdapter('window-object', '1.0', window);
然后,在 iframe 上你会这样做:
var facade = window.endpoint.createFacade('window-object','1.0', { neighborhood: 'group' });
facade.on('ready', function() {
facade.getApi().show();
});
跨域
如果你是跨域的,那就有点复杂了。两边都要加跨域链接:
在 iframe 中:
var windowLinkConfig = {
linkId: 'link-example0.com',
type: 'window',
settings: {
origin: 'http://example0.com:80',
external: true
}
};
var link = window.endpoint.getConfiguration().addLink(windowLinkConfig);
link.announceWindow(window.parent);
在父级中:
var windowLinkConfig = {
linkId: 'link-example1.com',
type: 'window',
settings: {
origin: 'http://example1.com:80',
external: true
}
};
window.endpoint.getConfiguration().addLink(windowLinkConfig);
那么你必须稍微调整一下你的适配器以确保安全:
var adapter = window.endpoint.registerAdapter('window-object', '1.0', window, { neighborhood: 'universal' });
您可以查看有效的跨域示例here。您可能想要包装窗口对象并只公开您想要的方法......否则 iframe 将拥有对父窗口对象方法的完全访问权限。