Javascript跨域通信到iframe的父窗口
Javascript communicating cross-domain to parent window of iframe
我写了一个记笔记的工具,从网页上抓取图像。它通过使用javascript书签将自身作为iFrame加载到当前窗口中:
javascript:(function(){ _my_script=document.createElement('SCRIPT'); _my_script.type='text/javascript'; _my_script.src='http://basereality.test/js/bookmarklet.js?rand='+(Math.random()); document.getElementsByTagName('head')[0].appendChild(_my_script); })();
我希望能够通过从父窗口删除iFrame关闭工具,当用户单击关闭按钮。
最简单的方法是什么-是否有可能关闭iFrame内部?
我已经尝试使用跨域消息发布。我有跨域发布工作从父窗口到子iFrame,但不工作从iFrame到父窗口。
目前我得到的代码(可能包含了问题)如下:
在父窗口中通过动态加载的Javascript:
function addiFrame(domain){
var iframe_url = "http://" + domain + "/bookmarklet";
var div = document.createElement("div");
div.id = bookmarkletID;
var str = "";
iframe_url += "?description=" + encodeURIComponent(document.title);
iframe_url += "&URL=" + encodeURIComponent(document.URL);
str += "<div>";
str += "<iframe frameborder='0' class='toolPanelPopup dragTarget' style='z-index: 1000' name='bookmarklet_iframe' id='bookmarklet_iframe' src='" + iframe_url + "' width='550px' height='255px' style='textalign:right; backgroundColor: white;' />";
str += "</div>";
div.innerHTML = str;
document.body.insertBefore(div, document.body.firstChild);
}
function jQueryLoadedCallback(){
jQueryAlias = jQuery.noConflict();
jQueryAlias('#' + bookmarkletID).bind('basereality.removeFrame', removeFrame);
}
function removeFrame(){
alert("Calling remove frame");
$("#" + bookmarkletID).remove();
}
在iFrame中,关闭iFrame的按钮调用:
function removeFrame(){
var params = {};
params.message = 'basereality.removeFrame';
parent.postMessage(params, "*");
}
在iFrame中调用removeFrame不会导致在父窗口中调用removeFrame。我该如何删除iFrame
postMessage可能就是您正在寻找的。Mozilla已经记录了这一点,它有相当不错的跨浏览器支持:
https://developer.mozilla.org/en-US/docs/DOM/window.postMessage我还围绕这个概念写了一个库,它可能需要一些调试,但它可以在github: https://github.com/tsharp/OF.Core.js/blob/master/js/of/window.messaging.js
从这里开始,你需要在父窗口上设置一个事件监听器来处理所有传入的请求…这将从父上下文中删除iframe。下面是注册消息接收事件的示例。function registerWindowHandler() {
if (typeof window.addEventListener !== 'undefined') {
window.addEventListener('message', receiveMessage, false);
} else {
// Support for ie8
window.attachEvent('onmessage', receiveMessage);
}
}
相关文章:
- 防止Iframe窗体在新窗口中打开
- node-webkit-从父窗口捕获iframe鼠标事件
- 如何关闭html中的iframe弹出窗口
- 允许父窗口在其不同域的子iframe上调用函数
- 检查iframe内部的窗口是否已关闭
- 在jQuery中的IFrame中提交表单后刷新父窗口
- 在引导程序弹出窗口中显示iframe
- 可以'iframe的父窗口中发生捕获错误
- 如何在不使用iframe或库的情况下创建剪切显示窗口区域
- 获取相对于窗口的IFRAME位置
- iframe是否可能在没有主窗口帮助的情况下自行调整大小
- 如何在窗口调整大小时调整iframe的大小
- Iframe如何访问chrome扩展中的父窗口
- 从父窗口上的iFrame内容中关闭iFrame
- 关闭iframe中的模式弹出窗口
- 在iframe内的新选项卡/窗口中打开
- 从子项(iframe)检测窗口关闭命令
- `base`tag导致iframe在Internet Explorer中以新窗口的形式打开
- 是否可以打开一个新窗口并将iframe嵌入其中
- IE11 iFrame点击事件弹出以影响窗口