1

我写了一个记笔记的工具,从网页上抓取图像。它使用 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。

4

1 回答 1

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);
    }
}
于 2013-03-23T01:30:46.330 回答