Javascript将跨域通信到iframe的父窗口

时间:2013-03-23 01:06:33

标签: javascript iframe cross-domain

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

1 个答案:

答案 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);
    }
}