1

с благодарностью принимаем любую помощь со следующим:Любой способ узнать, завершено ли XMLHttpRequest в отдельной области XMLHttpRequest?

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

function PostFile(fileInputId, id) { 

    var formdata = new FormData(); 
    var fileInput = $('#fileinput' + '_' + id)[0]; 

    formdata.append(fileInput.files[0].name, fileInput.files[0]); 
    formdata.append("Id", id); 

    //Creating an XMLHttpRequest and sending 
    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', '/Bookings/UploadArtwork'); 

    xhr.send(formdata); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4 && xhr.status == 200) {    

      if ($.ajax.active == 0) { 

       NoOtherFilesBeingUploaded(); 
      } 
     } 
    }; 
} 

Моя проблема заключается в том, что я только хочу, чтобы функция NoOtherFilesBeingUploaded(), чтобы работать, если нет никаких других файлов в настоящее время загружается через другие формы на странице; т. е. если в настоящее время нет другого XMLHttpRequest.

Фактически, мне нужен счетчик текущих открытых XMLHttpRequests. Тем не менее, я обнаружил, что ajaxStart() не запускает события XMLHttpRequests, поэтому $ .ajax.active всегда 0.

У кого-нибудь есть идеи?

Заранее спасибо

Update:

Я использую XMLHttpRequest, так что я могу добавить индикатор следующим образом:

xhr.upload.addEventListener("progress", function (event) { 

    if (event.lengthComputable) { 
     var percentComplete = Math.round(event.loaded * 100/event.total); 
     $('#progressNumber_' + id).html(percentComplete.toString() + '% complete'); 
    } 
    else { 
     $('#progressNumber_' + id).html('unable to compute'); 
    } 
}, false); 

Извинения для ухода это из оригинального поста ,

+0

Почему вы создаете свой собственный XHR, когда вы уже используете JQuery? – Blazemonger

+1

Если вы используете ['$ .ajax'] (http://api.jquery.com/jQuery.ajax/), то он создает объект jqXHR, который может вернуть ваша функция. Затем вы можете использовать [отложенные методы] (http://api.jquery.com/category/deferred-object/) на этом объекте в любое время. – Blazemonger

+0

Привет ... спасибо за ответы. Поэтому, если я использую $ .ajax, как здесь: http://stackoverflow.com/questions/5392344/sending-multipart-formdata-with-jquery-ajax функция ajaxStart() будет увеличиваться с каждым запросом? – ledragon

ответ

0

ок вот как я получил это работает:

function PostFile(fileInputId, id) { 

    var formdata = new FormData(); 
    var fileInput = $('#fileinput' + '_' + id)[0]; 

    formdata.append(fileInput.files[0].name, fileInput.files[0]); 
    formdata.append("id", id); 

    $.ajax({ 
     url: '/Bookings/UploadArtwork', 
     data: formdata, 
     cache: false, 
     contentType: false, 
     processData: false, 
     type: 'POST', 
     xhr: function() 
     { 
      var xhr = new window.XMLHttpRequest(); 

      xhr.upload.addEventListener("progress", function (evt) { 
       if (evt.lengthComputable) { 
        var percentComplete = Math.round(evt.loaded * 100/evt.total); 
        $('#progressNumber_' + id).html(percentComplete.toString() + '% complete'); 
       } 
      }, false); 

      xhr.addEventListener("loadend", function (evt) { 
       if ($.active == 0) { 
        NoOtherFilesBeingUploaded(); 
       } 
      }, false); 

      return xhr; 
     }, 
     success: function (data) { 

     } 
    }); 
} 

Благодаря Dave Bond здесь: http://www.dave-bond.com/blog/2010/01/JQuery-ajax-progress-HMTL5/

2

jQuery's ajaxStart() только пожары для XMLHttpRequests поступают из самого jQuery. Один альтернативный подход может заключаться в том, чтобы поддерживать счетчик самостоятельно, увеличивая его после xhr.send и уменьшая его в функции onreadystatechange.

+0

Привет, Джеки ... спасибо за комментарий. Это была моя оригинальная мысль. Я задавался вопросом, есть ли у кого-то лучшая идея. – ledragon