Сколько раз срабатывает onunload? - PullRequest
2 голосов
/ 12 июля 2009

Мне только что помогли с проблемой, у меня есть здесь .

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

Чтобы полностью решить эту проблему, я хотел знать, будет ли onunload запускаться один раз или каждый раз, когда происходит событие?

Другими словами, будет ли моя функция startLoad запускаться каждый раз, когда дочернее окно "win" перенаправляется, закрывается и т. Д.? Или он сделает это событие один раз и все?

Извините, если это глупый вопрос.

Спасибо всем

Ответы [ 4 ]

3 голосов
/ 12 июля 2009

Нет - этот метод может запускаться несколько раз при переходе от страницы в 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>

По сути, событие запускается один раз для фактического щелчка якоря, и один раз, когда страница фактически отправляет ответ. Я видел эту проблему только тогда, когда у вас есть javascript в href якоря, хотя, если вы используете кнопки ссылок ASP.NET, то будьте осторожны, поскольку это помещает javascript в href.

Для большинства других видов навигации (например, пользователь щелкает обычную привязку или закрывает браузер, или уходит с закладкой и т. Д.) Событие срабатывает только один раз.

1 голос
/ 11 июля 2011

Если вы хотите убедиться, что ваш обработчик событий запускается только после того, как вы можете заставить обработчик отменять привязку при первом запуске Это гарантирует, что обратный вызов не будет выполняться более одного раза:

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();
1 голос
/ 12 июля 2009

Это должно срабатывать только один раз, при первом запуске окна. Все остальное будет дырой в безопасности.

0 голосов
/ 14 октября 2009

Чтение WebKit Page Cache II - Событие выгрузки для интересного обсуждения того, как событие выгрузки воспроизводится с функцией кэширования страниц современных браузеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...