2013-03-30 13 views
5

Czy można uzyskać postęp przesyłania dla formularza z bardzo dużymi polami tekstowymi za pomocą jQuery ajax? Myślę, że klient wie, ile bajtów zostało wysłanych, ale kiedy znajduję Google, znajduję tylko rozwiązania do przesyłania plików za pomocą kodu strony serwera.Postęp przesyłania pliku jQuery AJAX dla dużych pól tekstowych

To mój ajax-request:

$.ajax({ 
     type: "POST", 
     url: "index.php?action=saveNewPost", 
     data: {textbox1: textbox1,textbox2: textbox2}, 
     contentType: "application/x-www-form-urlencoded;charset=UTF-8", 
     success: function(){ 
      // 
     } 
    }); 

Miałem nadzieję, że będzie coś w stylu „onProgress” z parametrem zawierającym ilość bajtów wysłanych już ...

znalazł rozwiązanie

$.ajax({ 
     xhr: function() { 
      var req = $.ajaxSettings.xhr(); 
      if (req) { 
       req.upload.addEventListener('progress', function(event) { 
        if (event.lengthComputable) { 
         $('#ajaxFeedbackDiv').html(event.loaded); // = 'test'; //event.loaded + '/' + event.total; 
        } 
       }, false); 
      } 
      return req; 
     }, 
     type: "POST", 
     url: "index.php?action=saveNewPost", 
     data: {textbox1: textbox1,textbox2: textbox2}, 
     contentType: "application/x-www-form-urlencoded;charset=UTF-8" 
     } 
    }); 

to wydaje się działać, altough nadal istnieją

2 problemy:

  1. połączenia na moim localhost jest zbyt szybki, więc trudno, aby zobaczyć „postęp” faktycznie działa. Zainstalowałem to narzędzie na komputerze Macintosh w tej samej sieci i widzę, że działa idealnie.
  2. Nie jestem pewien, czy będzie to przyjazne dla przeglądarek niezgodnych z XHR/HTML5, tj. Po prostu przesłać bez informacji o postępie?
+0

Właściwie tam naprawdę 'onprogress' zwrotna w' obiektu XMLHttpRequest'. Jest to jednak nowy standard i nie wszystkie przeglądarki go obsługują. – Licson

+0

proszę zobaczyć, co dodałem powyżej, to działa. Dzięki za wsparcie –

Odpowiedz

4

Możesz to osiągnąć dzięki nowemu obiektowi XMLHttpRequest w przeglądarkach obsługujących HTML5. Obsługuje zdarzenie progress, które można subskrybować i otrzymywać powiadomienia o operacji AJAX.

Oto przykład:

document.getElementById('myForm').onsubmit = function() { 
    var xhr = new XMLHttpRequest(); 

    xhr.upload.addEventListener('progress', function(e) { 
     if (e.lengthComputable) { 
      var percentage = Math.round((e.loaded * 100)/e.total); 
      document.getElementById('progress').innerHTML = percentage + '%'; 
     } 
    }, false); 

    xhr.open(this.method, this.action, true); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4 && xhr.status == 200) { 
      alert(xhr.responseText); 
     } 
    }; 

    xhr.send(new FormData(this)); 
    return false;  
}; 

i oto live demo.

+0

dziękuję bardzo, ale to by znaczyło, że to działa tylko z przeglądarkami obsługującymi HTML5 i nie mogę już używać jQuery AJAX? Powinienem przynajmniej mieć przyjazne działanie awaryjne (tzn. Nie wyświetlające postępu) na niekompatybilnych przeglądarkach ... –

+0

Widzę w dokumentacji jQuery, że żądanie jQuery-AJAX zwraca obiekt xhr, próbowałem go użyć z twoim event -energetem postępu, ale to nie działa ... –

+0

Tak, to działa tylko z przeglądarkami obsługującymi HTML5. –

Powiązane problemy