中止xmlhttprequest

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)设置uploadCanceledxhr:

function uploadCanceled(evt) {
    console.log("Cancelled: " + this.status);
}
Run Code Online (Sandbox Code Playgroud)

示例: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);
Run Code Online (Sandbox Code Playgroud)

示例:http://jsfiddle.net/rC63r/1/

  • @moderns不完全.IE7支持这个答案的焦点,`xhr.status`和`xhr.abort()`.但是,[`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)"此外,问题中的`FormData`需要[IE 10以后](http://caniuse.com/#feat=xhr2). (2认同)