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

Остановить блокировку браузера во время (синхронно) Ajax?

То, что я пытаюсь сделать, это добавить изображение загрузки в div (так что пользователь знает, что что-то загружается), а затем я вызываю функцию jquery ajax, которая установлена ​​на "async: false". Вот мой код:

$jQuery("#playersListDiv").html(loadingImage);    
$jQuery.ajax({
         type: "POST", /* this goesn't work with GET */
         url: urlValue, /*ex: "NBAgetGamesList.php" */
         data: parameters, /*ex: "param1=hello" */
         cache: false,
         async: false,
                     success: function(data){

                     }
});

Проблема заключается в том, что браузер блокирует и не добавляет загружаемое изображение до тех пор, пока не будет выполнено обращение ajax, что бесполезно, конечно. Firefox - единственный браузер, который фактически добавляет загрузочный образ. IE, Chrome и Safari НЕ добавляйте загружаемое изображение.

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

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

4b9b3361

Ответ 1

Несмотря на ваше утверждение об обратном, вам не нужно, чтобы он был синхронным. Независимо от того, что вам нужно сделать с/после ответа, можно выполнить в случае успешного (и/или ошибки или полного) обратного вызова. Итак, измените:

$jQuery("#playersListDiv").html(loadingImage);    
$jQuery.ajax({
   ...
   async: false,
   ...
});
// OTHER CODE

:

$jQuery("#playersListDiv").html(loadingImage);    
$jQuery.ajax({
   ...
   async: true,
   success: function(data) {
      // OTHER CODE
   }
});

Или переместите "ДРУГОЙ КОД" к отдельной функции, которую вы вызываете из обратного вызова успеха.

Если вам нужно что-то более сложное, чем это, вы можете инкапсулировать вышеуказанное в функцию и передать ему обратный вызов:

function doAjaxStuff(callback) {
    $jQuery("#playersListDiv").html(loadingImage);    
    $jQuery.ajax({
       ...
       async: true,
       success: function(data) {
          // optional other processing here, then:
          callback(data);
       }
    });
}

// then from somewhere else in your code:
doAjaxStuff(function(data) {
   // do something with data
});

Ответ 3

Я столкнулся с этой проблемой, и я нашел для нее решение.
Пусть! вам действительно нужно использовать async : false в ajax request, и вы хотите показать загружаемое изображение во время выполнения запроса ajax. Но запрос ajax останавливает другую операцию пользовательского интерфейса (отображение загрузочного изображения) из-за async : false. Итак, простое решение для этого, используйте fadeIn для отображения загружаемого изображения и fadeOut, чтобы скрыть загружаемое изображение.

Вот демон jsFiddle, в котором содержится запрос ajax с async : false. Из-за этого загружаемое изображение не отображается. (Я использовал show метод для отображения загружаемого изображения.).

Вот еще jsFiddle с эффектом fadeIn и fadeOut. Он отображает загружаемое изображение независимо от async : false в ajax запросе.