2013-10-09 4 views
5

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

На данный момент, я использую что-то вроде этого:

$(window).on('unload', function() { 
    $.ajax(....);  
}); 

Будет ли огонь Ajax вызова во всех браузерах или существуют ситуации, когда это не будет работать, и где эта ситуация должна быть обработаны по-другому? Мне не нужно иметь дело ни с чем с точки зрения функции успеха, я беспокоюсь только о том, что информация делает его на сервере.

Спасибо.

+1

Вы не можете рассчитывать на событие «разгрузки», которое создается до того, как страница уйдет. Это будет сделано браузером в * нормальных * обстоятельствах, но не тогда, когда браузер ничего не сможет с этим поделать (например, внезапное отключение системы). – Pointy

+0

Вы не можете полагаться на что-либо этим логи ... * тянет силу аккорда * –

ответ

3

Если вы используете jQuery, вы можете установить async в false в вызове ajax. И это может сработать, но ваши результаты могут отличаться в зависимости от браузера. Вот пример jsFiddle. http://jsfiddle.net/jtaylor/wRkZr/4/

// Note: I came across a couple articles saying we may should to use window.onbeforeunload instead of or in addition to jQuery's unload. Keep an eye on this. 
//  http://vidasp.net/jQuery-unload.html 
//  https://stackoverflow.com/questions/1802930/setting-onbeforeunload-on-body-element-in-chrome-and-ie-using-jquery 

var doAjaxBeforeUnloadEnabled = true; // We hook into window.onbeforeunload and bind some jQuery events to confirmBeforeUnload. This variable is used to prevent us from showing both messages during a single event. 


var doAjaxBeforeUnload = function (evt) { 
    if (!doAjaxBeforeUnloadEnabled) { 
     return; 
    } 
    doAjaxBeforeUnloadEnabled = false; 
    jQuery.ajax({ 
     url: "/", 
     success: function (a) { 
      console.debug("Ajax call finished"); 
     }, 
     async: false /* Not recommended. This is the dangerous part. Your mileage may vary. */ 
    }); 
} 

$(document).ready(function() { 
    window.onbeforeunload = doAjaxBeforeUnload; 
    $(window).unload(doAjaxBeforeUnload); 
}); 

В Google Chrome, вызов Ajax всегда завершается до того, как перейти от страницы.

Однако я бы ОЧЕНЬ НЕ РЕКОМЕНДУЕТ идти по этому маршруту. «A» в ajax для «асинхронного», и если вы пытаетесь заставить действовать как синхронный вызов, вы просите о неприятностях. Эта проблема обычно проявляется в замораживании браузера, что может случиться, если вызов ajax занял много времени.

В случае жизнеобеспечения попросите пользователя перед тем, как перейти от страницы, если на странице есть данные, которые должны быть отправлены через ajax. Для примера см этот вопрос: jquery prompt to save data onbeforeunload

1

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

0

Вы должны использовать событие onbeforeunload и выполнить синхронный вызов AJAX.

$.ajax({ 
    ... 
    "url": "http://www.example.com", 
    "async": false, 
    ... 
}); 
0

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

$(window).on('unload', function() { 
    window.open("myscript.php"); 
}); 

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

Смежные вопросы