2012-05-25 81 views
2

我希望我能够做好我的功课,在过去的几个小时内搜索互联网并在发布之前尝试所有内容,但我真的接近称它不可能,所以这是我的最后一次采取。回调JavaScript中的弹出窗口

我想要一个简单的事情(但在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 = ...和$(窗口).ready()),没有工作后在父窗口中设置回调。

我也试着定义一些方法,在子窗口源代码内注册回调:

function registerCallback(_callback) 
{ 
    callback = _callback; // also window.callback = _callback; 
} 

但与相同的结果。

而我没有更多的想法。当然,使用window.opener来设置这个值很简单,但是我会失去这个子窗口所需的大部分灵活性(实际上是DAM系统的资产选择器)。

如果您有一些想法,请分享它们。 谢谢!

回答

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,正如我在博客文章中所描述的那样。我在这里不包括博客文章的全文,因为这不是这个问题的主题。

URL的博客文章:http://82517.tumblr.com/post/23798369533/using-fancybox-with-iframe-as-modal-dialog-on-a-web

+0

你知道这是否也适用于https url吗? – Amien

1

想到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); 
+0

谢谢您的回答,但我很害怕,我不能局部IE支持走在这条和caniuse.com状态,即支持仅限于框架/ iframe(甚至在IE10.0中)。 –