Подтвердить что ты не робот

JQuery Ajax call - установить значение переменной для успеха

У меня есть приложение, которое я пишу, которое изменяет данные на кешированном объекте на сервере. Модификации выполняются с помощью вызова ajax, который в основном обновляет свойства этого объекта. Когда пользователь работает, у меня есть базовая кнопка "Сохранить изменения", которая позволяет им сохранять данные и скрывать кешированный объект.

Чтобы защитить пользователя, я хочу предупредить их, если попытаться перейти от страницы, когда были внесены изменения в объект сервера, если они не были сохранены. Таким образом, я создал метод веб-службы IsInitialized, который вернет true или false, основываясь на том, были ли сохранены изменения. Если они не были сохранены, я хочу пригласить пользователя и дать им возможность отменить свой запрос на навигацию.

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

   ////Catches the users to keep them from navigation off the page w/o saved changes...
window.onbeforeunload = CheckSaveStatus;
var IsInitialized;

function CheckSaveStatus() {

    var temp = $.ajax({
        type: "POST",
        url: "URL.asmx/CheckIfInstanceIsInitilized",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(result) {
            IsInitialized = result.d;
        },
        error: function(xmlHttpRequest, status, err) {
            alert(xmlHttpRequest.statusText + " " + xmlHttpRequest.status + " : " + xmlHttpRequest.responseText);
        }

    });

    if (IsInitialized) {
        return "You currently have unprocessed changes for this Simulation.";
    }
}

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

Как только что было указано, я делаю асинхронный вызов, а это означает, что остальная часть кода вызывается до того, как мой метод вернется. Есть ли способ использовать этот вызов ajax, но все же поймать событие window.onunload? (без создания синхронных аякс)

4b9b3361

Ответ 1

Так как вам нужно это поведение в событии unload, вам придется сделать синхронный вызов. Однако он может заморозить окно браузера/вкладку в зависимости от того, сколько времени займет звонок, а потому, что вы фактически пытаетесь запретить пользователю закрывать окно...

Добавьте async: false в свой JSON для синхронного вызова.

Ответ 2

Пример страницы jquery:

var html = $.ajax({
  url: "some.php",
  async: false
 }).responseText;

Источник: http://api.jquery.com/jQuery.ajax/

Ответ 3

Дело в том, что запрос на вызов Ajax асинхронен. Поэтому к тому моменту, когда вы проверяете, что вы инициализированы, вызов еще не завершен.

Я предлагаю указать ваше поведение в функции успеха.

В основном наличие синхронных вызовов с ajax, если не невозможно, чем действительно обескураженное.

Ответ 4

Теоретически вы можете убить событие (вернуть false) и закрыть окно успеха, но я думаю, что вы столкнулись с ограничениями Javascript, установленными некоторыми пользователями, а также просто путаете их о том, почему их окно не закрывается. Итак, я согласен с Pawel Krakowiak, сам вызов ajax должен быть синхронным.

Я добавлю, что вы захотите дать пользователю уведомление о том, что вы проверяете статус (а не всплывающее окно, пожалуйста, один из этих красивых баннеров уведомлений в верхней части окна) и обязательно установите $.ajax "timeout" для чего-то более разумного для этой ситуации, поэтому они не ждут навсегда закрытия окна.

Ответ 5

У меня была аналогичная проблема с попыткой установить свойство для объекта данных через обратный вызов успеха запроса ajax. Использование async: false также не решило мою проблему. В результате я использовал вызов setTimeout вне вызова ajax и установил значение таймаута равным 1:

function getSessionid() {  
    $.ajax({  
        type: 'POST',  
        url: 'getSession.php',  
        dataType: 'text',  
        success: function(result){myData.sessionid = result;},   
        error: function(data) {alert("Error!\n" + data);} 
    });  
    setTimeout(function() {alert('sessionid = ' + myData.sessionid);},1);  
}  

Просто задержка в 1 миллисекунду сделала всю разницу в мире. Без него свойство sessionid не будет установлено за пределами вызова ajax, хотя предупреждения в обратном вызове показали, что он действительно был установлен. Это о чем подумать, если вы столкнетесь с аналогичной проблемой.

Ответ 6

Похоже, лучший подход для меня заключался в использовании опции async: false для моего вызова ajax. Хотя я понимаю Рашака за это, я считаю, что эта ситуация оправдывает средства.

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

Спасибо всем, кто прокомментировал.