Javascript 让xmlhttprequest等待,告诉我从处理程序获得响应?
嗨,我制作了一个Ajax上传表单,它可以处理多个文件 我使用XMLHttpRequest();发送请求,但我真正想做的是让表单一次发送一个文件(发送第一个文件,然后等待upload.php响应,然后发送下一个文件) 我一直在尝试,但没有成功:Javascript 让xmlhttprequest等待,告诉我从处理程序获得响应?,javascript,php,ajax,xmlhttprequest,Javascript,Php,Ajax,Xmlhttprequest,嗨,我制作了一个Ajax上传表单,它可以处理多个文件 我使用XMLHttpRequest();发送请求,但我真正想做的是让表单一次发送一个文件(发送第一个文件,然后等待upload.php响应,然后发送下一个文件) 我一直在尝试,但没有成功: function _(el){ return document.getElementById(el); } function uploadFile(){ var file = _("file").files; var formdata= new Form
function _(el){
return document.getElementById(el);
}
function uploadFile(){
var file = _("file").files;
var formdata= new FormData();
var ajax;
for(var i=0;i<file.length;i++){
formdata.append("file[]",file[i]);
ajax= new XMLHttpRequest();
ajax.upload.addEventListener("progress",progressHandler, false);
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler,false);
ajax.open("POST","Upload.php");
ajax.send(formdata);
}
}
function progressHandler(event){
_("loaded_n_total").innerHTML = "Uploaded "+event.loaded+" bytes of "+event.total;
var percent= (event.loaded / event.total) * 100;
_("progressBar").value = Math.round(percent);
_("status").innerHTML = Math.round(percent)+"% uploading... please wait";
}
function completeHandler(event){
_("status").innerHTML = event.target.responseText;
_("progressBar").value = 0;
}
函数(el){
返回文档.getElementById(el);
}
函数uploadFile(){
var file=uU8;(“文件”).files;
var formdata=new formdata();
var-ajax;
对于(var i=0;i如果在循环中运行此函数,则循环不会等待任何异步操作。我认为,更好的方法是使用某种堆栈,在该堆栈中,您将拥有您的文件。而不是创建一个方法,在调用时只发送一个文件。要更好地理解,请参阅下面的示例:
var files;
function _(el) {
return document.getElementById(el);
}
function uploadFiles() {
files = _("file").files;
sendFile(); // start sending files
}
function sendFile() {
// checking, that there is any file to upload yet
if (files.lenght == 0) {
completeHandler();
return true; // upload is complete, you don't want to continue this method any more
}
var index = (files.length - 1); // current file
var file = files[index]; // sending only one file per call - the last item of files variable
var formdata= new FormData();
formdata.append("file[]",file); // inserting current file
files.splice(index, 1); // don't forget to remove current file from the stack, otherwise you'll get an infinite loop
var ajax = new XMLHttpRequest();
ajax.upload.addEventListener("progress",progressHandler, false);
ajax.addEventListener("load", sendFile, false); // on complete call this method again to send another file
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler,false);
ajax.open("POST","Upload.php");
ajax.send(formdata);
return true; // on send return true as a success (not so important)
}
其他处理程序方法将是原始的