onbeforeunload не позволяет сбросить значение cookie [duplicate]

Моя проблема началась, когда я попытался изменить сервер из IIS Express на локальный IIS (при использовании LocalDB).

Я использовал LocalDB (для целей dev), и когда я перешел из Local IIS в IIS Express, Visual Studio переключила мой источник данных с Data Source = (LocalDb) \ MSSQLLocalDB на Источник данных =. \ SQLEXPRESS

Неправильная строка соединения

Правильная строка соединения

Надеюсь, что это поможет кому-то.

37
задан Aperçu 2 February 2017 в 18:58
поделиться

4 ответа

У меня была та же проблема, когда Chrome не отправлял запрос AJAX на сервер в событии window.unload.

Я мог только заставить его работать, если запрос был синхронным. Я смог сделать это с помощью Jquery и установить для свойства async значение false:

$(window).unload(function () {
   $.ajax({
     type: 'GET',
     async: false,
     url: 'SomeUrl.com?id=123'
   });
});

Вышеприведенный код работает для меня в IE9, Chrome 19.0.1084.52 m и Firefox 12.

29
ответ дан Aperçu 19 August 2018 в 05:59
поделиться
  • 1
    Пожалуйста, прочитайте обновленный ответ, приведенный @Mohoch ниже. Он дает обновленный ответ, отражающий изменения браузера. – jaredbaszler 17 February 2016 в 23:54
  • 2
    Ты спас мой день! – Sanjay Gupta 30 August 2016 в 10:58
  • 3
    Обратите внимание, что синхронные вызовы ajax не рекомендуется. IIRC, современные браузеры покажут предупреждение в консоли при выполнении синхронизации ajax. – Sparky 21 November 2016 в 12:25
  • 4
    Решение не сработало. Он работает только раз в то время. – Ahm23 3 June 2018 в 19:06

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

Like @Garry Английский сказал , отправка асинхронного запроса во время страницы onunload не будет работать, так как браузер убьет поток перед отправкой запроса. отправка запроса на синхронизацию должна работать.

Это было правильно до версии 29 Chrome, но в Chrome V 30 он неожиданно прекратил работу , как указано здесь .

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

НО ПРИМЕЧАНИЕ: другие браузеры не позволят вы отправляете запросы Ajax в событии onbeforeunload вообще. так что вам нужно будет выполнить действие как в разгрузке, так и перед загрузкой, и проверить, было ли это уже сделано.

Что-то вроде этого:

var _wasPageCleanedUp = false;
function pageCleanup()
{
    if (!_wasPageCleanedUp)
    {
        $.ajax({
            type: 'GET',
            async: false,
            url: 'SomeUrl.com/PageCleanup?id=123',
            success: function ()
            {
                _wasPageCleanedUp = true;
            }
        });
    }
}


$(window).on('beforeunload', function ()
{
    //this will work only for Chrome
    pageCleanup();
});

$(window).on("unload", function ()
{
    //this will work for other browsers
    pageCleanup();
});

Надеется, что это поможет кто-нибудь.

53
ответ дан Community 19 August 2018 в 05:59
поделиться
  • 1
    Спасибо за публикацию! Я искал способ сделать эту работу некоторое время. – musical_coder 24 December 2013 в 00:09
  • 2
    абсолютно блестящий ! – Shabi_669 24 December 2013 в 17:34
  • 3
    Ошибка onbeforeunload синхронизации также слишком ... – Sebas 2 January 2014 в 21:42
  • 4
    @AitazazKhan, есть пример в самом ответе, используя как onunload, так и onbeforeunload. Вы также можете просмотреть эту страницу для получения дополнительных пояснений и примеров. Если мне не хватает чего-то в вашем вопросе, пожалуйста, не стесняйтесь уточнять, чтобы я мог точно определить точную проблему. – Mohoch 28 June 2015 в 07:47
  • 5
    Отлично. Вы могли бы просто написать ... .on ('unload beforeunload', ... и упаковать функцию прямо там, не так ли? – Johannes Grandy 6 April 2017 в 09:43

Попробуйте создать переменную (желательно Boolean) и измените ее, как только вы получите ответ от вызова Ajax. И положите функцию bas_disconnect_only() внутри цикла while. У меня также была такая проблема, как однажды. Я думаю, это происходит потому, что Chrome не ждет вызова Ajax. Я не знаю, как я его исправил, и я не пробовал этот код, поэтому я не знаю, работает ли он. Вот пример этого:

var has_disconnected = false;
window.onbeforeunload = function () {
    while (!has_disconnected) {
        bas_disconnect_only();
        // This doesn't have to be here but it doesn't hurt to add it:
        return true;
    }
}

И внутри функции bas_send_request() ( xmlhttp - HTTP-запрос):

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
        has_disconnected = true;
}

Хорошо удачи, и я надеюсь, что это поможет.

3
ответ дан Metod Medja 19 August 2018 в 05:59
поделиться
  • 1
    Спасибо за ответ. Это стоит попробовать. Но мне удалось найти другое решение, которое не требует от клиента отключения. Спасибо всем тем же. – lang2 10 February 2011 в 09:55

Осмотрите метод Navigator.sendBeacon () , который был создан для этой цели.

На странице MDN:

Навигатор .sendBeacon () может использоваться для асинхронной передачи небольших HTTP-данных из User Agent на веб-сервер.

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

Это относительно новый API и, похоже, не поддерживается IE еще.

12
ответ дан Sparky 19 August 2018 в 05:59
поделиться
  • 1
    Обратите внимание, что некоторые блокировщики рекламы (например, uBlock Origin) блокируют Navigator.sendBeacon из-за некоторого чувства предотвращения слежения. В результате ваше приложение не может полагаться на него. – Reid 11 August 2017 в 21:29
Другие вопросы по тегам:

Похожие вопросы: