2012-01-03 3 views
1

Я хочу отправить запрос ajax, когда пользователь покидает страницу или закрывает окно.
Вот мой код внутри:'onbeforeunload' Fires Twice

<script type="text/javascript"> 
    function sendajax(){ 
     $.ajax({ 
      url: "someurl", 
      data: mydata, 
      async : false 
     }); 
    } 
</script> 
    <script type="text/javascript"> 
    window.onbeforeunload=function(){sendajax();}; 
</script> 

Когда событие происходит пожар событий дважды.
Почему это происходит?
Я знаю, что могу предотвратить это, добавив переменную var ajaxSent=true;, но может быть, есть более чистый способ сделать это?

UPD:
Я заменил sendajax содержание функции с другим кодом (без отправки AJAX), и выяснил, что Ajax не один вызывает проблему. Он все еще входит в функцию дважды.

+0

Есть ли какие-либо фреймы на странице? – beeglebug

+0

Нет, это часть тестовой страницы, которая содержит только текст и ссылку – lvil

+0

Можете ли вы привести пример? Кроме того, в каком браузере вы это видите? – beeglebug

ответ

5

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

Учитывая следующий код:

<script> 
    function doSomething() { console.log('onbeforeunload fired'); } 
    window.onbeforeunload = doSomething; 
</script> 
<a href="garbage">link A</a> 
<a href="http://google.com">link B</a> 

Если я нажимаю на ссылку А, я получаю две записи журнала консоли, если нажать на ссылку B я только получить один.

Похоже, что это может быть причуда того, как браузеры обрабатывают свои внутренние страницы «Эта страница не найдена», в результате чего ваша страница обновляется и закрывается перед показом сообщения, оставляя вас с двумя вхождениями событие onbeforeunload.

+0

добавили обновление к вопросу. – lvil

+0

Я обнаружил, что поведение события beforeunload значительно варьируется (особенно в отношении того, сколько раз оно вызывается) в зависимости от режима документа IE. более недавнее и более стандартное поведение срабатывает реже, чем предыдущее совместимое (IE10) совместимость. – BlueMonkMN

0

Вы можете попробовать следующий код:

<script type="text/javascript"><br> 
    window.onbeforeunload=function sendajax(){<br> 
     $.ajax({<br> 
      url: "someurl",<br> 
      data: mydata,<br> 
      async : false<br> 
     });<br> 
};<br> 
</script> 

или вы можете определить sendajax() {} на каком-то месте, и использовать его как onbeforeunload = "sendajax()" не как onbeforeunload = "function() { sendajax() }"

+0

В чем заключается назначение именования встроенной функции? После этого вы не можете ссылаться на sendajax, это кажется излишним. – beeglebug

+0

@beeglebug: Вы правы, это тот случай, когда вы хотите использовать эту функцию только один раз. Если вы хотите использовать эту функцию, вы можете определить ее в каком-либо другом месте и вызывать как onbeforeload = "sendajax()" не нравится onbeforeload = "function() {sendajax()}" , потому что здесь вызывается sendajax два раза сначала при определении функции (обратите внимание не на sendajax() на внешнюю), а после дебизации внешняя функция сама вызывается один раз, которая снова вызывает sendajax(). –

+0

У меня есть изменения 'window.onbeforeunload = function() {sendajax();};' к окну.onbeforeunload = "sendajax()";» и 'window.onbeforeunload = "sendajax();";' и 'window.onbeforeunload = "sendajax";'. Ничего из вышеперечисленного не работало вообще. Функция просто не выполнялась. – lvil