2011-10-29 38 views
15

Tôi đang sử dụng HTML5 để tải tệp lên. Tôi có một sự kiện bấm nút gắn liền với hàm uploadFile(). Nó hoạt động tốt. Tôi cũng có một nút riêng để hủy tải lên. Tôi biết chúng ta cần gọi xhr.abort(); Nhưng làm cách nào để truy cập đối tượng xhr trong hàm uploadCanceled? Tôi có thể làm cho đối tượng xhr toàn cầu nhưng đó không phải là cách thích hợp. Ai đó có thể hướng dẫn tôi ở đây không?Hủy bỏ 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"); 
    } 

Cheers

+0

Bạn đang cố gắng truy cập 'xhr' khi nó đã được hủy bỏ (trong 'uploadCanceled') hoặc làm bạn cần đạt tới nó để bạn có thể gọi là 'hủy bỏ'? Câu hỏi của bạn và bình luận của bạn dưới đây dường như không phù hợp với nhau. –

Trả lời

16

addEventListener sẽ thiết lập ngữ cảnh (this) của uploadCanceled để xhr:

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

Ví dụ: http://jsfiddle.net/wJt8A/


Nếu, thay vào đó, bạn cần phải kích hoạt xhr.abort thông qua nhấp chuột "Hủy", bạn có thể trả lại tham chiếu và thêm bất kỳ người nghe nào bạn cần sau đó:

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

Ví dụ: http://jsfiddle.net/rC63r/1/

+0

Cảm ơn bạn đã trả lời. Điều đó đã giúp rất nhiều. – lewis

+0

Mã này có tương thích với IE7 không? – moderns

+2

@moderns Không hoàn toàn. Trọng tâm của câu trả lời này, 'xhr.status' và' xhr.abort() ', được hỗ trợ trong IE7. Nhưng, ['addEventListener()'] (https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener) chỉ được hỗ trợ bởi IE9 và sau đó. Các phiên bản trước thay vì sử dụng ['attachEvent()'] (http://msdn.microsoft.com/en-us/library/ie/ms536343.aspx). "[Sử dụng chính xác addEventListener()/attachEvent()?] (Http://stackoverflow.com/questions/2657182/correct-usage-of-addeventlistener-attachevent)" Ngoài ra, 'FormData' từ câu hỏi yêu cầu [IE 10 và sau này] (http://caniuse.com/#feat=xhr2). –

2

Bạn sẽ có thể tham khảo các "này" từ khóa trong xử lý sự kiện canceledUpload của bạn. Điều đó đề cập đến XMLHttpRequest. Đặt này trong xử lý:

this.abort(); 
+0

cảm ơn bạn đã trả lời. Nhưng làm thế nào để tôi gọi hàm uploadCanceled với sự trợ giúp của một nút? Tôi biết nó sẽ được gọi nếu tôi tải lại trang. Tôi không nghĩ rằng tôi có thể liên kết nó với một sự kiện onClick và sau đó sử dụng this.abort() phải không? – lewis

+0

Xem xét điều này: http://jsfiddle.net/yE8r3/ Mã không chạy ở đây nhưng cho biết cách bọc mọi thứ trong bao đóng. Đối tượng có tên s được hiển thị bên trong trình đóng và trình xử lý nhấp chuột, nhưng không hiển thị bên ngoài phần đóng. – dnuttle

+0

Trình xử lý sự kiện 'cancelUpload' là gì? – stevemao

0

Abort tất cả 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

nếu không cần thiết, để kiểm tra điều kiện anyways. Cài đặt .length dường như không tốt. Bạn có thể bật từng cái một hoặc gán mảng cho [] – daghan