I am using HTML5 for uploading files. I have a button click event attached to the function uploadFile()
. It works fine. I also have a separate button to cancel the upload. I know we need to call xhr.abort()
but how do I access the xhr object in the uploadCanceled
function? I can make the xhr object global but that is not the proper way. Can someone guide me here?
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");
}
Cheers
Yes, if you haven't tricked your server to keep it alive, it will be closed after the response is sent. Maybe you want to look for websockets. But if you don't want to play with those, just create a new HttpRequest for each of your "request".
XMLHttpRequest (XHR) is an API in the form of an object whose methods transfer data between a web browser and a web server.
XMLHttpRequest is a built-in browser object that allows to make HTTP requests in JavaScript. Despite having the word “XML” in its name, it can operate on any data, not only in XML format.
addEventListener
will set the context (this
) of uploadCanceled
to xhr
:
function uploadCanceled(evt) {
console.log("Cancelled: " + this.status);
}
Example: http://jsfiddle.net/wJt8A/
If, instead, you need to trigger xhr.abort
through a "Cancel" click, you can return a reference and add any listeners you need after that:
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);
Example: http://jsfiddle.net/rC63r/1/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With