XHR abort doesn#39;t stop file uploading(XHR 中止不会停止文件上传)
问题描述
我已经制作了一个带有进度条的基于 XHR 的文件上传器,我想添加一个功能以在完全上传之前取消上传.简化的代码(在 DOM 准备好后运行):
I've made an XHR-based file uploader with progressbar, and I would like to add a feature to cancel the upload before it fully uploaded. The simlified code (runs after DOM ready):
var xhr;
$('#upload').click(function(){
var file = $('#file').get(0).files[0];
xhr = new XMLHttpRequest();
xhr.upload.onprogress = function(event){
if (event.lengthComputable){
var percent = event.loaded / event.total;
$('#uploadpercent').html(Math.round(percent * 100) + "%");
}
};
xhr.abort = function(){
console.log('aborted');
};
xhr.onload = function(){
$('#uploadpercent').html("100%");
// ...
};
xhr.open("POST", "upload.php?filename=" + file.name);
xhr.send(file);
});
$('#cancel').click(function(){
xhr.abort();
});
在调用 xhr.abort()
之后,abort 事件处理程序将 'aborted' 打印到控制台,但它不执行任何其他操作.进度条没有停止,完成后,整个文件被上传.在最新的 Firefox 和 Chrome 上测试.
After the xhr.abort()
called, the abort event handler prints the 'aborted' to the console, but it doesn't do anything else. The progress bar doesn't stop, and after it finished, the entire file is uploaded. Tested on the latest Firefox and Chrome.
我无法弄清楚我的代码有什么问题.
I can't figure out what is wrong with my code.
我用 jQuery 也试过了,代码:(主要来自 如何异步上传文件?)
I've tried the same with jQuery, the code: (mostly from How can I upload files asynchronously?)
var jqXHR;
$('#upload').click(function(){
var file = $('#file').get(0).files[0];
jqXHR = $.ajax({
type : "POST",
url : "upload.php?filename=" + file.name,
data : file,
xhr: function(){
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload){
myXhr.upload.addEventListener('progress', function(event){
if (event.lengthComputable){
var percent = event.loaded / event.total;
$('#uploadpercent').html(Math.round(percent * 100) + "%");
}
}, false);
}
return myXhr;
},
success : function(response){
$('#uploadpercent').html("100%");
if (response.length > 0){
console.log(response);
}
},
error : function(_jqXHR, textStatus){
if (textStatus === "abort"){
console.log('aborted');
}
},
cache : false,
contentType : false,
processData : false
});
});
$('#cancel').click(function(){
jqXHR.abort();
});
令我惊讶的是,这按预期工作.当 jqXHR.abort()
被调用时,'aborted' 文本也被打印出来,进程停止,只有部分文件被上传.问题是我想让我的代码在未来独立于 jquery,但我还不明白为什么我的代码不能以同样的方式工作.
To my surprise, this is working as expected. When the jqXHR.abort()
called, the 'aborted' text also printed, the process stopped, and only part of the file have been uploaded.
The problem is I want to make my code independent of jquery in the future, and I don't understand yet why my code isn't working the same way.
推荐答案
好的,我注意到事件名称是 onabort.使用 xhr.abort = ...
行,我覆盖了 abort 函数.所以解决方案:
Ok, I noticed that the event name is onabort. With the xhr.abort = ...
line I overwrote the abort function. So the solution:
xhr.onabort = function(){...};
或
xhr.addEventListener("abort", function(){...});
这篇关于XHR 中止不会停止文件上传的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:XHR 中止不会停止文件上传
基础教程推荐
- Electron 将 Node.js 和 Chromium 上下文结合起来意味着 2022-01-01
- 直接将值设置为滑块 2022-01-01
- 用于 Twitter 小部件宽度的 HTML/CSS 2022-01-01
- html表格如何通过更改悬停边框来突出显示列? 2022-01-01
- 自定义 XMLHttpRequest.prototype.open 2022-01-01
- 我可以在浏览器中与Babel一起使用ES模块,而不捆绑我的代码吗? 2022-01-01
- Chart.js 在线性图表上拖动点 2022-01-01
- Vue 3 – <过渡>渲染不能动画的非元素根节点 2022-01-01
- 如何使用TypeScrip将固定承诺数组中的项设置为可选 2022-01-01
- 如何使用JIT在顺风css中使用布局变体? 2022-01-01