gpt4 book ai didi

Javascript跨域通信到iframe的父窗口

转载 作者:行者123 更新时间:2023-11-30 07:16:24 26 4
gpt4 key购买 nike

我写了一个记笔记的工具,从网页抓取图片。它通过使用 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);
}
}

关于Javascript跨域通信到iframe的父窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15582211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com