深入淺出new FormData()

一、概述

FormData對(duì)象的使用:

  1. 用一些鍵值對(duì)來模擬一系列表單控件:即把form中所有的元素的name與value組成一個(gè)queryString。
  2. 異步上傳二進(jìn)制文件。

二、使用

  1. 創(chuàng)建一個(gè)空對(duì)象實(shí)例。

    var myform = new FormData();
    
  2. 使用已有的表單來初始化

    <form id="myForm" action="" method="post">
     <input type="text" name="name">名字
         <input type="password" name="psw">密碼
     <input type="submit" value="提交">
    </form>
    

    可以使用這個(gè)表單元素作為初始化參數(shù),來實(shí)例化FormData對(duì)象

    // 獲取頁(yè)面已有的一個(gè)form表單
    var form = document.getElementById("myForm");    //HTML結(jié)構(gòu)沒有表單元素直接忽略這一句
    // 用表單來初始化
    var formData = new FormData(form);    //HTML結(jié)構(gòu)沒有表單元素:var formData = new FormData()
    // 我們可以根據(jù)name來訪問表單中的字段
    var name = formData.get("name"); // 獲取名字
    var psw = formData.get("psw"); // 獲取密碼
    // 當(dāng)然也可以在此基礎(chǔ)上,添加其他數(shù)據(jù)
    formData.append("token","kshdfiwi3rh");
    
  3. API操作

    3.1、取值

    formData.get("name"); // 獲取key為name的第一個(gè)值
    formData.getAll("name"); // 返回一個(gè)數(shù)組,獲取key為name的所有值
    

    3.2、添加數(shù)據(jù)

    ? 通過append(key,value)來添加數(shù)據(jù),如果指定的key不存在則會(huì)新增一條數(shù)據(jù),如果key存在,則追加到數(shù)據(jù)末尾

    formData.append("k1", "v1");
    formData.append("k1", "v2");
    formData.append("k1", "v1");
    
    formData.get("k1"); // "v1"
    formData.getAll("k1"); // ["v1","v2","v1"]
    

    3.3、設(shè)置修改數(shù)據(jù)

    ? 通過set(key,value)來設(shè)置修改的數(shù)據(jù),如果指定的key不存在則會(huì)新增一條,如果存在,則會(huì)修改對(duì)應(yīng)的value值

    formData.append("k1", "v1");
    formData.set("k1", "1");
    formData.getAll("k1"); // ["1"]
    

    3.4、判斷是key是否存在

    ? 通過has(key)判斷key對(duì)應(yīng)的鍵值對(duì)是否存在,存在返回值為true,不存在返回值為false

    formData.append("k1", "v1");
    formData.append("k2",null);
    
    formData.has("k1"); // true
    formData.has("k2"); // true
    formData.has("k3"); // false
    

    3.5、刪除數(shù)據(jù)

    ? 通過delete(key)刪除key對(duì)應(yīng)的鍵值對(duì)

    formData.append("k1", "v1");
    formData.append("k1", "v2");
    formData.append("k1", "v1");
    formData.delete("k1");
    
    formData.getAll("k1"); // []
    

    3.6、遍歷

    3.6.1、每調(diào)用一次next()返回一條數(shù)據(jù),數(shù)據(jù)的順序由添加的順序決定
    3.6.2、返回的是一個(gè)對(duì)象,當(dāng)其done屬性為true時(shí),說明已經(jīng)遍歷完所有的數(shù)據(jù),這個(gè)也可以作為判斷的依據(jù)
    3.6.3、返回的對(duì)象的value屬性以數(shù)組形式存儲(chǔ)了一對(duì)key/value,數(shù)組下標(biāo)0為key,下標(biāo)1為value,如果一個(gè)key值對(duì)應(yīng)多個(gè)value,會(huì)變成多對(duì)key/value返回
    formData.append("k1", "v1");
    formData.append("k1", "v2");
    formData.append("k2", "v1");
    
    var i = formData.entries();
    
    i.next(); // {done:false, value:["k1", "v1"]}
    i.next(); // {done:fase, value:["k1", "v2"]}
    i.next(); // {done:fase, value:["k2", "v1"]}
    i.next(); // {done:true, value:undefined}
    
  4. 發(fā)送數(shù)據(jù)到后臺(tái)

    <!--HTML部分-->
    <form action="">
     <label for="">
         姓名: <input type="text" name="name">
     </label>
     <label for="">
         文件:<input id="file" type="file" name="file">
         </label>
         <label for="">
         <input type="button" value="保存">
     </label>
    </form>
    
    4.1、原生ajax
    //原生js上傳文件
    //獲取按鈕
    var btn = document.querySelector('[type=button]');
    //綁定事件
    btn.onclick = function () {
        //獲取input標(biāo)簽
        var file = document.querySelector('[type=file]');
        // 新建FormData對(duì)象
        var formData = new FormData();
        // 取得input標(biāo)簽中的文件。注:input標(biāo)簽中的文件可以選擇多個(gè)
        formData.append('upload', file.files[0]);
     //創(chuàng)建XMLHttpRequest,用這個(gè)來發(fā)送數(shù)據(jù)
        var xhr = new XMLHttpRequest;
        /*初始化HTTP請(qǐng)求參數(shù)(請(qǐng)求方式,url,是否同步)*/
        xhr.open('post', 'file.php');
     
     /*
     xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
     設(shè)置請(qǐng)求頭的contentType
     */
     
        // 監(jiān)聽上傳進(jìn)度
        xhr.upload.onprogress = function (ev) {
        // 事件對(duì)象
        // console.log(ev);
    
            var percent = (ev.loaded / ev.total) * 100 + '%';
    
            console.log(percent);
    
            progress.style.width = percent;
        }
    
        xhr.send(formData);
    
        xhr.onreadystatechange = function () {
        //status狀態(tài)為200 表示請(qǐng)求成功,readystate為4表示對(duì)象傳遞完畢或者準(zhǔn)備就緒 
                if(xhr.readyState == 4 && xhr.status == 200) {
                }
        }
    }
    
    4.2、jq ajax
    //綁定提交事件
    function upload() {
        //獲取form表單元素
        var f = document.getElementById("myForm");
        //使用表單元素來構(gòu)造FromData
        var myform = new FormData(f);
        $.ajax({
            url: "/Library/test/upload",
            type: "post",
            dataType: "json",
            data: myform,
            cache: false,                      // 不緩存
            processData: false,                // jQuery不要去處理發(fā)送的數(shù)據(jù)
            contentType: false,                // jQuery不要去設(shè)置Content-Type請(qǐng)求頭
            success: function (data) {
                console.log(data);
            }
        });
    }
    
    4.3、axios
    //不需要html板塊方式
    //注意:input type="file" 需要通過用戶主觀點(diǎn)擊某塊元素觸發(fā)事件,不可頁(yè)面加載完成調(diào)用,被動(dòng)調(diào)用報(bào)錯(cuò):File chooser dialog can only be shown with a user activation.(翻譯:文件選擇器對(duì)話框只能在用戶激活時(shí)顯示。)
    function upImg(){
        const inp = document.createElement("input");
     const _this = this
     inp.type = "file";
     inp.click();
     inp.onchange = function(e) {
             console.log(e.target.files[0]);
             let params = new FormData(); //創(chuàng)建form對(duì)象
             params.append("file", e.target.files[0]);
             _this.$axios.post("/api/Base/uploadImg", params).then(res => {
                 console.log(res)
         }).catch(err => {
             console.log(err);
         });
     }
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容