'onbeforeunload' стреляет дважды - PullRequest
       19

'onbeforeunload' стреляет дважды

2 голосов
/ 03 января 2012

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

<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 не является причиной проблемы.Он по-прежнему входит в функцию дважды.

Ответы [ 3 ]

5 голосов
/ 03 января 2012

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

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

<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>

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

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

1 голос
/ 10 декабря 2018

У меня была та же проблема, и потребовалось некоторое время, чтобы понять и решить ее, поделившись подробностями дела:

В нашем шаблоне был пользовательский JS, который манипулировал меню. Это приводило к тому, что выгрузка запускалась дважды, только при нажатии на ссылки меню, а не на другие ссылки и только в IE / EDGE.

Мы в конечном итоге остановили распространение по этим ссылкам, и проблема была решена.

$('.SELECTOR a[href^="http://"]').on('click', function(e){
    e.stopPropagation();
});

Это конкретная ошибка в вашем приложении, поэтому вы не найдете слишком много информации в Google.

0 голосов
/ 03 января 2012

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

<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() }"

...