2011-10-29 18 views
15

को छोड़कर मैं फ़ाइलों को अपलोड करने के लिए HTML5 का उपयोग कर रहा हूं। मेरे पास फ़ंक्शन अपलोडफाइल() से जुड़ा एक बटन क्लिक ईवेंट है। यह ठीक काम करता है। अपलोड को रद्द करने के लिए मेरे पास एक अलग बटन भी है। मुझे पता है कि हमें xhr.abort() को कॉल करने की आवश्यकता है; लेकिन मैं अपलोड किए गए फ़ंक्शन में xhr ऑब्जेक्ट का उपयोग कैसे करूं? मैं xhr ऑब्जेक्ट ग्लोबल कर सकता हूं लेकिन यह उचित तरीका नहीं है। क्या कोई मुझे यहां मार्गदर्शन कर सकता है?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"); 
    } 

चीयर्स

+0

आप एक बार यह निरस्त किया गया है 'xhr' का उपयोग करने की कोशिश कर रहे हैं (' uploadCanceled' अंदर), या आप करते हैं इसे पहुंचने की आवश्यकता है ताकि आप 'abort' को कॉल कर सकें? आपका प्रश्न और नीचे दी गई टिप्पणियां एक दूसरे के साथ लाइन नहीं लगती हैं। –

उत्तर

16

addEventListeneruploadCanceledxhr करने के संदर्भ (this) स्थापित करेगा:

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

उदाहरण: http://jsfiddle.net/wJt8A/


, तो इसके बजाय, आप की जरूरत है "रद्द करें" क्लिक के माध्यम से xhr.abort को ट्रिगर करें, आप एक संदर्भ वापस कर सकते हैं और किसी भी श्रोताओं को जोड़ सकते हैं आप उस के बाद की जरूरत है:

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

उदाहरण: http://jsfiddle.net/rC63r/1/

+0

उत्तर के लिए धन्यवाद। इससे बहुत मदद मिली। – lewis

+0

क्या यह कोड आई 7 के साथ संगत है? – moderns

+2

@moderns पूरी तरह से नहीं। इस उत्तर का ध्यान, 'xhr.status' और 'xhr.abort()', IE7 में समर्थित हैं। लेकिन, ['addEventListener()'] (https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener) केवल IE9 और बाद में समर्थित है। इसके बजाय पिछले संस्करण ['attachEvent()'] (http://msdn.microsoft.com/en-us/library/ie/ms536343.aspx) का उपयोग किया जाता है। "[AddEventListener()/attachEvent()?] (Http://stackoverflow.com/questions/2657182/correct-usage-of-addeventlistener-attachevent) का सही उपयोग" इसके अलावा, प्रश्न से 'फॉर्मडेटा' की आवश्यकता है [आईई 10 और बाद में] (http://caniuse.com/#feat=xhr2)। –

2

आप अपने canceledUpload ईवेंट हैंडलर में "इस" कीवर्ड को संदर्भित करने के लिए सक्षम होना चाहिए। यह XMLHttpRequest को संदर्भित करता है। हैंडलर में इस रखो:

this.abort(); 
+0

उत्तर के लिए धन्यवाद। लेकिन मैं बटन की मदद से अपलोड रद्द किए गए फ़ंक्शन को कैसे कॉल करूं? मुझे पता है कि अगर मैं पेज को फिर से लोड करता हूं तो इसे बुलाया जाएगा। मुझे नहीं लगता कि मैं इसे ऑनक्लिक घटना से जोड़ सकता हूं और फिर इस .abort() का उपयोग कर सकता हूं? – lewis

+0

इसे देखें: http://jsfiddle.net/yE8r3/ कोड यहां नहीं चलता है लेकिन दिखाता है कि चीजों को बंद करने के तरीके को कैसे लपेटें। नामित ऑब्जेक्ट बंद होने के भीतर दिखाई देता है, और क्लिक हैंडलर, लेकिन बंद होने के बाहर नहीं। – dnuttle

+0

'रद्द यूप्लोड' ईवेंट हैंडलर क्या है? – stevemao

0

बीच में बंद करें सभी 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

यदि अनावश्यक है, तो वैसे भी उस स्थिति की जांच के लिए। सेटिंग। लम्बाई अच्छा नहीं लग रहा था। आप उन्हें एक-एक करके पॉप कर सकते हैं या सरणी को [] – daghan