我希望我做好我的功课,在最近几个小时内搜索互联网并在发布之前尝试所有内容,但我真的很接近称之为不可能,所以这是我的最后一招。
我想要一个简单的事情(但在JavaScript中似乎很难):
但我希望以系统的方式实现它,为此弹出窗口定义回调;类似的东西:
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系统的资产选择器)提供很大的灵活性。
如果您有一些想法,请分享。 万分感谢你!
答案 0 :(得分: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);
答案 1 :(得分:1)
经过几个小时的实验,我想,我找到了解决问题的可行方案。
重点是从父窗口引用jQuery并在此窗口上触发jQuery事件(我是Mac用户,但我想,jQuery的事件跨平台工作,因此IE兼容性不是问题所在。)< / p>
这是我在锚点上点击处理程序的代码......
$(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