2014-09-26 1 views
1

Я знаю, что в некоторых браузерах (IE, Chrome), которые изменяются в DOM, не будет выполняться до тех пор, пока функция не будет завершена. Я прочитал различные предложения о том, как с этим бороться, но мне не повезло. Я пытаюсь выполнить цикл вызовов AJAX и показать прогресс для каждой обрабатываемой строки. Код выглядит так:jQuery изменение изображения во время выполнения функции для отображения прогресса

for(i=0; i < rowIds.length; i++){ 

    $(rowImage).attr('src', '/images/spinner.gif'); 

     $.ajax({ 
        type: 'GET', 
        url: ajaxUrl, 
        async: false, 
        processData: true, 
        data: {}, 
        dataType: "json", 
        success: function(data) { 
         $(rowImage).attr('src', '/images/success.gif'); 
        } 
       }); 
} 

Я прочитал несколько предложений о попытке убедиться, что преобразование изображения происходит перед началом работы, например, сделать это до начала вызова AJAX:

var changeImage = function() { 
    $(rowImage).attr('src', '/images/spinner.gif'); 
}; 

$.when(changeImage()).done(function() { 
      //run AJAX call 

Но это не имеет значения. Изображения не меняются до тех пор, пока функция не будет выполнена.

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

+0

Добро пожаловать в мир использования синхронных вызовов Ajax, которые блокируют браузер. – epascarello

ответ

0

Jquery:

$.ajax({ 
     type: 'GET', 
     url: ajaxUrl, 
     async: false, 
     processData: true, 
     data: {}, 
     dataType: "json", 
     success: function(data) { 
      $(rowImage).attr('src', '/images/success.gif'); 
     } 
}); 

$(document).ajaxStart(function() { 
     $(rowImage).attr('src', '/images/spinner.gif'); 
    }).ajaxStop(function() { 

}); 
+0

Спасибо за два предложения. К сожалению, ни один из них не работает. .ajaxStart только срабатывает при первом вызове ajax, но независимо от того, какое изображение не изменяется до конца. Я узнал, что .ajaxSend лучше всего при попытке сделать что-то в начале каждого запроса ajax в последовательности. Но в то время как .ajaxSend, похоже, работает с любыми другими действиями кода, он не меняет изображения до конца всех вызовов. Такое же поведение с beforeSend. (Это верно как в IE, так и в Chrome, FF отлично работает даже с моим исходным кодом) – user3521590

0

Estimado:

Puedes intentar utilizar ла несильно beforeSend де Esta Маньера:

$.ajax({ 
       type: 'GET', 
       url: ajaxUrl, 
       async: false, 
       processData: true, 
       data: {}, 
       dataType: "json", 
       beforeSend: function(data){ 
        $(rowImage).attr('src', '/images/spinner.gif'); 
       }, 
       success: function(data) { 
        $(rowImage).attr('src', '/images/success.gif'); 
       } 
      }); 

Espero тэ SIRVA, Saludos

+0

Добро пожаловать в StackOverflow! Пожалуйста, обратите внимание, что вы должны использовать только английский для вопросов и ответов здесь. Ваш код выглядит хорошо, кстати. – VMai

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