JavaScript中弹出窗口的回调
我希望我的家庭作业做得很好,在过去的几个小时里在互联网上搜索,并在这里发布之前尝试一切,但我真的很接近于说这是不可能的,所以这是我的最后手段 我想要一个简单的东西(但在JavaScript中似乎很难):JavaScript中弹出窗口的回调,javascript,callback,popup,window,Javascript,Callback,Popup,Window,我希望我的家庭作业做得很好,在过去的几个小时里在互联网上搜索,并在这里发布之前尝试一切,但我真的很接近于说这是不可能的,所以这是我的最后手段 我想要一个简单的东西(但在JavaScript中似乎很难): 单击按钮->打开窗口(使用Window.Open) 在弹出窗口中执行操作,并将值返回给父级(打开器) 但是我想以一种系统的方式实现它,为这个弹出窗口定义一个回调;比如: var wnd = window.open(...) wnd.callback = function(value) {
var wnd = window.open(...)
wnd.callback = function(value) {
console.log(value);
};
我尝试在弹出窗口JS代码中定义回调属性:
var callback = null;
不幸的是,这不起作用,因为
$('#action').click(function() {
console.log(callback);
});
。。。只返回我最初设置的“null”
我还尝试过在窗口加载后在父窗口中设置回调(通过window.onload=…和$(window.ready()),但都不起作用
我还尝试在子窗口源代码中定义一些方法来在内部注册回调:
function registerCallback(_callback)
{
callback = _callback; // also window.callback = _callback;
}
但结果是一样的
我没有更多的想法。当然,使用window.opener设置值会很简单,但我会失去这个子窗口(实际上是DAM系统的资产选择器)所需的很多灵活性
如果你有一些想法,请分享。
万分感谢 HTML5的
postMessage
浮现在脑海中。它的设计正是为了完成您想要完成的任务:从一个窗口发布消息,然后在另一个窗口中处理
需要注意的是,这是一个相对较新的标准,因此较旧的浏览器可能不支持此功能
使用起来非常简单: 要从源窗口发送消息,请执行以下操作:
window.postMessage("message", "*");
//'*' is the target origin, and should be specified for security
要在目标窗口中侦听消息,请执行以下操作:
window.addEventListener
("message", function(e) {
console.log(e.data); //e.data is the string message that was sent.
}, true);
经过几个小时的实验,我想,我已经找到了解决问题的可行办法 关键是从父窗口引用jQuery并在此窗口上触发jQuery事件(我是Mac用户,但我认为jQuery具有跨平台工作的事件,因此IE兼容性在这里不是问题) 这是我在锚点上单击处理程序的代码
$(this).find('a[x-special="select-asset"]').click(function() {
var evt = jQuery.Event('assetSelect', {
url: 'this is url',
closePopup: true,
});
var _parent = window.opener;
_parent.jQuery(_parent.document).trigger(evt);
});
。。。这是事件处理程序的代码:
$(document).bind('assetSelect', function (evt) {
console.log(evt);
});
如果您不需要区分资产选择窗口的多个实例(只有一个窗口将发送“assetSelect”事件),则此解决方案很好。我还没有找到一种方法将一种标记参数传递给窗口,然后在事件中将其传递回
正因为如此,我选择了Fancybox解决方案(最终,更好,视觉效果更好)。不幸的是,默认情况下,也无法区分实例。因此,正如我在博客文章中所描述的,我扩展了Fancybox。我这里不包括博客的全文,因为这不是这个问题的主题
博客帖子的URL:谢谢你的回答,但我恐怕不能接受部分IE支持,正如caniuse.com所说,IE支持仅限于frame/iframe(即使在IE10.0中)。