JavaScript中弹出窗口的回调

JavaScript中弹出窗口的回调,javascript,callback,popup,window,Javascript,Callback,Popup,Window,我希望我的家庭作业做得很好,在过去的几个小时里在互联网上搜索,并在这里发布之前尝试一切,但我真的很接近于说这是不可能的,所以这是我的最后手段 我想要一个简单的东西(但在JavaScript中似乎很难): 单击按钮->打开窗口(使用Window.Open) 在弹出窗口中执行操作,并将值返回给父级(打开器) 但是我想以一种系统的方式实现它,为这个弹出窗口定义一个回调;比如: var wnd = window.open(...) wnd.callback = function(value) {

我希望我的家庭作业做得很好,在过去的几个小时里在互联网上搜索,并在这里发布之前尝试一切,但我真的很接近于说这是不可能的,所以这是我的最后手段

我想要一个简单的东西(但在JavaScript中似乎很难):

  • 单击按钮->打开窗口(使用Window.Open)
  • 在弹出窗口中执行操作,并将值返回给父级(打开器)
  • 但是我想以一种系统的方式实现它,为这个弹出窗口定义一个回调;比如:

    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中)。