使用 javascript 異步提交表單,實現無刷新的 post 上傳表單,主要使用的是瀏覽器基礎對象 (chrome,edge/ie11,firefox)
FormData
FromData 是一次 http mulitpartfrom-data 的請求內容
可以使用 append 方法向其添加名詞對
然后使用 XMLHttpRequest 的 send() 方法發送
eg:
var fileObj = new FromData();
fileObj.append('key',value); // value 可以是一個字符串 string 也可以是一個 blob (代表,file對象)
var xhr = new XMLHttpRequest();
xhr.open('POST','url',true);
xhr.send(fileObj);
// fileObj 傳遞的是 files[0] 對象,eg:fildObj = document.getElementById('file_pic').files[0]
var FILES = function(fileObj,url,callback,data){ if(!fileObj){ alert('請選擇發布文件'); return; }; var FileController = url; // 接收上傳文件的后台地址 // FormData 對象 var form = new FormData(); // 可以增加表單數據 // 存入文件對象 form.append("file",fileObj); // 其他描述參數解析 if(data!=''){ for(var key in data){ form.append(key,data[key]); }; }; // XMLHttpRequest 對象 var xhr = new XMLHttpRequest(); xhr.open("POST", FileController, true); xhr.onload = function () { if(xhr.readyState == 4 && xhr.status == 200){ // 查看后台反饋 if(callback){ var req = xhr.responseText; callback(req); }; } else if(xhr.readyState == 4 && xhr.status == 404){ callback({allow:'error'}); return; }; }; xhr.upload.onprogress = function(evt){ //偵查附件上傳情況 //通過事件對象偵查 //該匿名函數表達式大概0.05-0.1秒執行一次 //console.log(evt); //console.log(evt.loaded); //已經上傳大小情況 //evt.total; 附件總大小 var loaded = evt.loaded; var tot = evt.total; var per = Math.floor(100*loaded/tot); var son = document.getElementById('son'); son.innerHTML = per+"%"; //son.style.width=per+"%"; } xhr.send(form); }