onunload触发了多少次?

时间:2009-07-12 17:36:32

标签: javascript events

我刚刚帮助解决了here问题。

var win = window.open(url, name);
win.onunload = StartLoad;
win.close();

要完全解决这个问题,我想知道一旦或每次发生事件时是否会触发 onunload

换句话说,每次子窗口“win”被重定向,关闭等时,我的函数startLoad会运行吗?或者它会做一次这个事件,就是这样吗?

道歉,如果这是一个愚蠢的问题。

全部谢谢

4 个答案:

答案 0 :(得分:3)

否 - 当您在IE6和IE7中浏览页面时,此方法可以多次触发。

此代码段说明了这一点(另存为OnUnloadTest.htm):

<body>
    <form id="form" action="OnUnloadTest.htm" method="post">
        Click <a href="javascript:form.submit()">here</a>
    </form>
    <script type="text/javascript">
        window.onbeforeunload = beforeunload
        function beforeunload() {
            alert('OnUnload');
        }
    </script>
</body>

基本上,事件会在实际锚定点击时触发一次,并且一旦页面实际回发,就会触发一次。我只在锚点的href中有javascript时才看到这个问题,尽管如果你使用ASP.NET链接按钮然后会被警告,因为这会将javascript放入href中。

对于大多数其他类型的导航(例如,用户点击普通锚点,或关闭浏览器,或使用书签导航等),事件只会触发一次。

答案 1 :(得分:1)

仅在第一次窗口卸载时触发一次。其他任何东西都是安全漏洞。

答案 2 :(得分:1)

如果你想确保你的事件处理程序只运行一次,你可以在第一次调用它时让处理程序解除绑定。这将保证回调不会运行多次:

var win = window.open(url, name);
win.onunload = function(event) {
    win.onunload = function() {}; // assign a noop
    return Startload.call(this, event);
};
win.close();

某些JavaScript库有一个内置帮助程序,用于绑定您只想运行一次的事件处理程序。例如,jQuery有一个one()方法用于此目的:

var win = window.open(url, name);
$(win).one('unload', Startload);
win.close();

答案 3 :(得分:0)

阅读WebKit Page Cache II – The unload Event,了解有关卸载事件如何与现代浏览器的页面缓存功能一起使用的有趣讨论。