2013-03-30 7 views
5

È possibile ottenere il progresso di caricamento di un modulo con campi di testo molto grandi utilizzando jQuery ajax? Penso che il client sappia quanti byte sono stati inviati, ma quando trovo Google trovo solo soluzioni per il caricamento di file usando il codice del sito del server.jQuery AJAX caricamento avanzamento per campi di testo di grandi dimensioni

Questo è il mio ajax-richiesta:

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

Speravo ci sarebbe qualcosa di simile "onProgress" con un parametro che contiene la quantità di byte già inviati ...

trovato una soluzione

$.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" 
     } 
    }); 

questo sembra funzionare, ospitarci ci sono ancora

2 problemi:

  1. il collegamento sul mio localhost è troppo veloce, quindi è difficile vedere il "progresso" in realtà di lavoro. Ho installato questo strumento http://mschrag.github.com su un secondo Mac nella stessa rete e vedo che funziona perfettamente.
  2. Non sono sicuro che questo accadrà in caso di browser non compatibili con XHR/HTML5, ovvero caricare semplicemente le informazioni di avanzamento?
+0

In realtà non c'è davvero un 'callback onprogress' nell'oggetto' XMLHttpRequest'. Tuttavia, è un nuovo standard e non tutti i browser lo supportano. – Licson

+0

si prega di vedere quello che ho aggiunto sopra, funziona. Grazie per il tuo supporto –

risposta

4

È possibile ottenere questo risultato con il nuovo oggetto XMLHttpRequest nei browser compatibili HTML5. Supporta l'evento progress a cui è possibile iscriversi e ricevere la notifica dell'operazione AJAX.

Ecco un esempio:

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;  
}; 

ed ecco una live demo.

+0

grazie mille, ma questo significherebbe che funzionerebbe solo con i browser compatibili con HTML5 e non posso più usare jQuery AJAX? Dovrei almeno avere un ripiego amichevole (cioè non mostrare progressi) su browser incompatibili ... –

+0

Vedo nella documentazione di jQuery che una richiesta jQuery-AJAX restituisce un oggetto xhr, ho provato ad usarlo con il tuo progress-eventlistener, ma non funziona ... –

+0

Sì, funzionerà solo con browser compatibili con HTML5. –

Problemi correlati