【问题标题】:Callback for a popup window in JavaScriptJavaScript 中弹出窗口的回调
【发布时间】:2012-06-01 12:12:45
【问题描述】:

我希望我的功课做得很好,在网上搜索了最后几个小时并尝试了所有方法,然后才发到这里,但我真的差点认为这是不可能的,所以这是我最后的选择。

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

  1. 单击按钮 -> 打开窗口(使用 window.open)
  2. 在弹窗中执行一个动作并将值返回给父级(开启者)

但我想以系统的方式实现它,为此弹出窗口定义一个回调;类似:

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 系统的资产选择器)。

如果您有一些想法,请分享。 谢谢你一百万!

【问题讨论】:

    标签: javascript callback popup window


    【解决方案1】:

    我认为,经过几个小时的实验,我找到了解决我的问题的可行解决方案。

    重点是从父窗口引用 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。此处不包括博文全文,因为不是本题的主题。

    博文网址:http://82517.tumblr.com/post/23798369533/using-fancybox-with-iframe-as-modal-dialog-on-a-web

    【讨论】:

      【解决方案2】:

      HTML5 的postMessage 浮现在脑海中。它旨在完成您想要完成的工作:从一个窗口发布消息并在另一个窗口中处理它。

      https://developer.mozilla.org/en/DOM/window.postMessage

      需要注意的是,它是一个相对较新的标准,因此较旧的浏览器可能不支持此功能。

      http://caniuse.com/#feat=x-doc-messaging


      使用起来非常简单:

      从源窗口发送消息:

      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);
      

      【讨论】:

      • 感谢您的回答,但恐怕我不能在这方面提供部分 IE 支持,正如 caniuse.com 所述,IE 支持仅限于 frame/iframe(即使在IE10.0)。
      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2013-06-06
      • 2014-12-26
      • 2013-12-17
      • 1970-01-01
      相关资源
      最近更新 更多