当弹出窗口关闭时,我如何引发事件(jQuery或vanilla Javascript)?

我想在弹出窗口关闭时,或者最好在关闭之前引发一个事件。 我将弹出窗口对象存储为对象,但我不知道绑定到close事件的任何方式,或者在窗口关闭之前的事件。

var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780"); 

有没有办法使用jQuery订阅close事件,或只是原始的javascript? 我正在使用jQuery并且不能添加另一个库,所以如果它不能在jQuery中完成,我将不得不以某种方式滚动我自己的事件系统,以便它可以在所有浏览器中工作。

更新:
我已经尝试在jQuery中使用unload事件,由于某种原因,只要我的弹出窗口打开而不是关闭时就会引发事件。 如果我使用Firebug来设置断点来延迟卸载事件的订阅,那么卸载事件就会按预期的方式工作,但无论出于何种原因,当允许javascript自然执行时它无法正常工作。

 var popupWindow = window.open("/popup.aspx", "popupWindow", "height=550,width=780"); $(popupWindow.window).unload(function() { alert('hello'); }); 

有没有人知道为什么在窗口加载时可以引发卸载事件?

另一个问题是,我注意到jQuery的“卸载”事件并没有像我通常那样保持订阅窗口:

 popupWindow.onunload = function(){alert('hello')}; 

它似乎每次提出时取消订阅该事件。 这应该发生吗? 如果它不是jQuery中的这个bug(或function?),那么在加载时引发事件就好了,因为我可以检查事件内的popupWindow.closed属性以确保窗口真的关闭。

我创建了一个观察器,用于检查窗口是否已关闭:

 var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true); var watchClose = setInterval(function() { if (w.closed) { clearTimeout(watchClose); //Do something here... } }, 200); 

我尝试了观察者的方法,但在IE6中使用它时遇到了“允许拒绝”问题。 发生这种情况的原因是,在关闭窗口的情况下,封闭的属性无法完全访问…但幸运的是,使用try {} catch构造它可以工作:o)

 var w = window.open("http://www.google.com", "_blank", 'top=442,width=480,height=460,resizable=yes', true); var watchClose = setInterval(function() { try { if (w.closed) { clearTimeout(watchClose); //Do something here... } } catch (e) {} }, 200); 

谢谢马格努斯

我想我弄清楚发生了什么:

当您使用window.open它会打开一个位置为“about:blank”的新窗口,然后将其更改为您在函数调用时提供的URL。

因此,unload事件在从“about:blank”更改为右url之前绑定,并在发生更改时触发。

我让它与JQuery一起工作:

 $(function(){ var win = window.open('http://url-at-same-domain.com','Test', 'width=600,height=500'); $(win).unload(function(){ if(this.location == 'about:blank') { $(this).unload(function(){ // do something here }); } }); }); 

卸载事件的jQuery代码示例

$(window).unload( function () { alert("Bye now!"); } );

从jQuery卸载文档

编辑:

我玩了,无法让父窗口设置卸载。 我能让它工作的唯一方法是让脚本出现在弹出窗口html中。 弹出窗口也需要加载jQuery。 我没有任何基础,但我相信卸载正在被触发,因为基本上弹出窗口正在从父窗口的范围中卸载。 只是一个猜测。

您必须让onBeforeUnload事件调用一个方法来通知您的处理程序。

有关演示,请参阅此页面。

http://www.4guysfromrolla.com/demos/OnBeforeUnloadDemo1.htm

使用window.onUnload

根据我之前的经验,我必须提到一个关于以前提到的onunload的一个小问题:

Opera 9.0.x-9.2.x仅在用户导航离开页面时才运行window.onUnload。 如果用户改为关闭窗口,则事件将永远不会触发。 我怀疑这是为了解决自我重载弹出问题(弹出窗口可以在页面关闭时重新打开)。

这很可能持续到Opera 9.5.x. 其他浏览器也可以实现这一点,但我不相信IE或Firefox。

从我检查的jQuery unload只是本机函数的包装器。 我可能错了,因为我没有挖那么深。

这个例子对我有用。

 $(document).ready(function(){ $(window).unload( function (){ alert('preget'); $.get( '/some.php', { request: 'some' } ); alert('postget'); }); }); 

请记住,某些浏览器会阻止window.open请求卸载,例如IE 。