$ (окно) .unload ожидают вызова Ajax для окончания прежде, чем оставить веб-страницу [дубликат]

Этот вопрос уже имеет ответ здесь:

В основном, после того как пользователь оставляет веб-страницу в моем приложении, я должен назвать Сценарий PHP с Ajax, который вставит время, проведенное на веб-странице к базе данных, и затем оставит страницу.

Важно ожидать запроса Ajax для окончания, потому что веб-страницы в моем приложении не доступны для пользователей, если они не провели определенное время на предыдущей странице (скажем, две минуты).

Вот мой код jQuery:

$(document).ready(function() {

    var teid = TEID;
    var startTime = new Date().getTime();

    $(window).unload(function() {
        var timeSpentMilliseconds = new Date().getTime() - startTime;
        var t = timeSpentMilliseconds / 1000 / 60;

        $.ajax({
            type: 'POST',
            url: '/clientarea/utils/record-time',
            data: 'teid=' + teid + '&t=' + t
        });
    });

});

Как я должен изменить его так, это будет ожидать запроса Ajax для окончания прежде, чем оставить веб-страницу?

Править:

Или могло бы быть лучше (легче) просто позволить Ajax запросить повторяться каждую минуту или около этого. Это возможно?

32
задан Richard Knop 29 June 2010 в 07:22
поделиться

6 ответов

Ну, вы можете установить async: false в своем вызове AJAX, чтобы браузер ждал завершения запроса, прежде чем делать что-либо еще, но обратите внимание, что это будет зависать 'браузер на время запроса.

$.ajax({
    type: 'POST',
    async: false,
    url: '/clientarea/utils/record-time',
    data: 'teid=' + teid + '&t=' + t
});

Из руководства:

По умолчанию все запросы отправляются асинхронно (т.е. по умолчанию установлено значение true). Если вам нужны синхронные запросы, установите для этого параметра значение false. Междоменные запросы и запросы dataType: jsonp не поддерживают синхронную работу. Обратите внимание, что синхронные запросы могут временно заблокировать браузер, отключив любые действия, пока запрос активен.

31
ответ дан 27 November 2019 в 20:42
поделиться

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

если страница беспокоит пользователя, это нехорошо ...

я предлагаю на странице подождать 2 минуты ( если требуется 2 минуты), затем отправьте ajax-сообщение о том, что пользователь отработал свои 2 минуты ...

затем вы можете проверить его на стороне сервера, есть ли у него 2 минуты или нет ...

4
ответ дан 27 November 2019 в 20:42
поделиться

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

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

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

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

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

2
ответ дан 27 November 2019 в 20:42
поделиться

Метод jQuery.ajax () имеет параметр async . Если вы установите для него значение false , вызов будет заблокирован до тех пор, пока ответ не вернется (или не истечет время ожидания). Я уверен, что вызов этого заставит браузер включиться в обработчик выгрузки.

Примечание: нельзя полагаться на это в работе. Если браузер дает пользователю возможность отменить обработчики выгрузки (что некоторые браузеры делают после некоторого времени ожидания), «время, проведенное на сайте» никогда не будет обновлено. Вы можете добавить на сайт таймер, который периодически вызывает сценарий на сервере и обновляет время. У вас не будет точного значения, но в вашем случае это не нужно.

Если вам нужно только знать, находился ли пользователь на странице X секунд, вы можете просто установить тайм-аут в обработчике загрузки (используя setTimeout (function, ms) ), который выполняет вызов, если пользователь потратил необходимое время. Таким образом, не было бы необходимости в обработчике выгрузки.

0
ответ дан 27 November 2019 в 20:42
поделиться

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

$(document).ready(function() {

    var teid = TEID;
    var startTime = new Date().getTime();

    var ajaxFunc = function() {
        var timeSpentMilliseconds = new Date().getTime() - startTime;
        var t = timeSpentMilliseconds / 1000 / 60;

        $.ajax({
            type: 'POST',
            url: '/clientarea/utils/record-time',
            data: 'teid=' + teid + '&t=' + t
        });
    };

    setInterval(ajaxFunc, 60000);

})

Вы будете рады, когда сможете использовать веб-сокеты :)

1
ответ дан 27 November 2019 в 20:42
поделиться

используйте onbeforeunload :

$(document).ready(function(){
  window.onbeforeunload = function(){
     // $.ajax stuff here
     return false;
  }
});

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

1
ответ дан 27 November 2019 в 20:42
поделиться
Другие вопросы по тегам:

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