2009-07-12 3 views
2

Мне только что помогли в решении проблемы here.Сколько раз срабатывает onunload?

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

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

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

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

Спасибо всем

ответ

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> 

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

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

+1

Не было вопроса о событии «разгрузить», а не «перегрузить» один? – kangax

1

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

0

Прочитано WebKit Page Cache II – The unload Event для интересного обсуждения того, как разгружается событие с функцией кеширования страниц в современных браузерах.

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(); 
Смежные вопросы