lew*_*wis 15 javascript html5 xmlhttprequest
我使用HTML5上传文件.我有一个附加到该功能的按钮单击事件uploadFile().它工作正常.我还有一个单独的按钮来取消上传.我知道我们需要调用xhr.abort()但是如何访问uploadCanceled函数中的xhr对象?我可以使xhr对象全局化,但这不是正确的方法.有人能指导我吗?
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");
}
Run Code Online (Sandbox Code Playgroud)
干杯
Jon*_*ski 16
addEventListener将context(this)设置uploadCanceled为xhr:
function uploadCanceled(evt) {
console.log("Cancelled: " + this.status);
}
Run Code Online (Sandbox Code Playgroud)
相反,如果需要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);
Run Code Online (Sandbox Code Playgroud)
示例:http://jsfiddle.net/rC63r/1/