2011-10-29 6 views
15

J'utilise HTML5 pour télécharger des fichiers. J'ai un événement de clic de bouton attaché à la fonction uploadFile(). Cela fonctionne très bien. J'ai également un bouton séparé pour annuler le téléchargement. Je sais que nous devons appeler xhr.abort(); Mais comment puis-je accéder à l'objet xhr dans la fonction uploadCanceled? Je peux rendre l'objet xhr global mais ce n'est pas la bonne façon. Quelqu'un peut-il me guider ici?Annulation de la xmlhttprequest

function uploadFile(){ 
    var filesToBeUploaded = document.getElementById("fileControl"); 
    var file = filesToBeUploaded.files[0]; 
    var xhr= new XMLHttpRequest(); 
    xhr.upload.addEventListener("progress", uploadProgress, false); 
    xhr.addEventListener("load", uploadComplete, false); 
    xhr.addEventListener("error", uploadFailed, false); 
    xhr.addEventListener("abort", uploadCanceled, false); 


    xhr.open("POST", "upload.php", true); 

    var fd = new FormData(); 
    fd.append("fileToUpload", file); 
    xhr.send(fd); 
} 


    function uploadCanceled(evt) { 
     alert("Upload has been cancelled"); 
    } 

Vive

+0

Êtes-vous essayez d'accéder 'xhr' une fois qu'il a été abandonné (dans les' uploadCanceled') ou avez-vous besoin de l'atteindre pour que vous puissiez appeler 'annuler '? Votre question et vos commentaires ci-dessous ne semblent pas s'aligner les uns avec les autres. –

Répondre

16

addEventListener va définir le contexte (this) de uploadCanceled à xhr:

function uploadCanceled(evt) { 
    console.log("Cancelled: " + this.status); 
} 

Exemple: http://jsfiddle.net/wJt8A/


Si, au contraire, vous devez déclencher xhr.abort via un clic "Annuler", vous pouvez renvoyer une référence et ajouter des écouteurs vous avez besoin après:

function uploadFile() { 
    /* snip */ 
    xhr.send(fd); 

    return xhr; 
} 

document.getElementById('submit').addEventListener('click', function() { 
    var xhr = uploadFile(), 
     submit = this, 
     cancel = document.getElementById('cancel'); 

    function detach() { 
     // remove listeners after they become irrelevant 
     submit.removeEventListener('click', canceling, false); 
     cancel.removeEventListener('click', canceling, false); 
    } 

    function canceling() { 
     detach(); 
     xhr.abort(); 
    } 

    // detach handlers if XHR finishes first 
    xhr.addEventListener('load', detach, false); 

    // cancel if "Submit" is clicked again before XHR finishes 
    submit.addEventListener('click', canceling, false); 

    // and, of course, cancel if "Cancel" is clicked 
    cancel.addEventListener('click', canceling, false); 
}, false); 

Exemple: http://jsfiddle.net/rC63r/1/

+0

Merci pour la réponse. Cela a beaucoup aidé. – lewis

+0

Ce code est-il compatible avec IE7? – moderns

+2

@moderns Pas entièrement. L'objet de cette réponse, 'xhr.status' et' xhr.abort() ', est pris en charge dans IE7. Mais, ['addEventListener()'] (https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener) est uniquement supporté par IE9 et plus tard. Les versions précédentes utilisaient à la place ['attachEvent()'] (http://msdn.microsoft.com/en-us/library/ie/ms536343.aspx). "[Utilisation correcte de addEventListener()/attachEvent()?] (Http://stackoverflow.com/questions/2657182/correct-usage-of-addeventlistener-attachevent)" De plus, 'FormData' de la question nécessite [IE 10 et plus tard] (http://caniuse.com/#feat=xhr2). –

2

Vous devriez être en mesure de faire référence à la « ce » mot-clé dans votre gestionnaire d'événements canceledUpload. Cela fait référence à XMLHttpRequest. Mettre cela dans le gestionnaire:

this.abort(); 
+0

merci pour la réponse. Mais comment appeler la fonction uploadCanceled à l'aide d'un bouton? Je sais qu'il sera appelé si je recharge la page. Je ne pense pas que je peux l'associer à un événement onClick et puis utiliser this.abort() à droite? – lewis

+0

Regardez ceci: http://jsfiddle.net/yE8r3/ Le code ne fonctionne pas ici mais montre comment emballer des objets dans une fermeture. L'objet nommé s est visible dans la fermeture, et le gestionnaire de clic, mais pas à l'extérieur de la fermeture. – dnuttle

+0

qu'est-ce qu'un gestionnaire d'événement 'cancellationUpload'? – stevemao

0

Abandonner tous XMLHttpRequest:

var array_xhr = new Array(); 
function uploadFile(){ 
    ... 
    var xhr = new XMLHttpRequest(); 
    array_xhr.push(xhr); 
    ... 
} 

function abort_all_xhr(){ 
    if (array_xhr.length>0) { 
     for(var i=0; i<array_xhr.length; i++){ 
      array_xhr[i].abort(); 
     } 
     array_xhr.length = 0; 
    }; 
} 

abort_all_xhr(); 
+1

si n'est pas nécessaire, pour les contrôles qui conditionnent de toute façon. L'établissement .length n'a pas semblé bon. Vous pouvez les afficher un par un ou affecter le tableau à [] – daghan