我写了一个工具,用于记笔记,从网页抓取图像。它使用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。
答案 0 :(得分:9)
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);
}
}