วิธีการตรวจสอบ FormData


221

ฉันได้พยายาม และบ่วงผ่านมันใช้console.logfor in

นี่คือMDN Referenceบน FormData

ความพยายามทั้งสองอยู่ในซอนี้

var fd = new FormData(),
    key;

// poulate with dummy data
fd.append("key1", "alskdjflasj");
fd.append("key2", "alskdjflasj");

// does not do anything useful
console.log(fd);

// does not do anything useful   
for(key in fd) {
    console.log(key);
}

ฉันจะตรวจสอบข้อมูลฟอร์มเพื่อดูว่ามีการตั้งค่าคีย์อย่างไร


มันเป็นคุณสมบัติของ Firefox เท่านั้นหรือไม่
Shiplu Mokaddim


1
คุณต้องการที่จะทำแทนkey of fd key in fdฉันยังไม่รู้ว่าทำไมถึงเป็นเช่นนี้ในทางเทคนิค แต่ใช้งานได้ เอกสารที่นี่
cilphex

ดังนั้นจึงไม่มีปลั๊กอิน chrome หรือ firefox ที่จะแสดงข้อมูลในแบบฟอร์มโดยไม่ต้องเพิ่มรหัสใด ๆ ในจาวาสคริปต์ของคุณ?
natel

คำตอบ:


298

วิธีการปรับปรุง:

ตั้งแต่เดือนมีนาคม 2559 ปัจจุบัน Chrome และ Firefox รุ่นล่าสุดรองรับการใช้งานFormData.entries()เพื่อตรวจสอบ FormData แหล่ง

// Create a test FormData object
var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');

// Display the key/value pairs
for (var pair of formData.entries()) {
    console.log(pair[0]+ ', ' + pair[1]); 
}

ขอบคุณGhost Echoและrloth ที่ชี้เรื่องนี้ออกมา!

คำตอบเก่า:

หลังจากดูบทความMozilla เหล่านี้ ดูเหมือนว่าไม่มีวิธีในการรับข้อมูลจากวัตถุ FormData คุณสามารถใช้พวกเขาสำหรับการสร้าง FormData เพื่อส่งผ่านคำขอ AJAX

ฉันยังพบเพียงแค่คำถามนี้ที่ระบุว่าสิ่งเดียวกัน: FormData.append ( "กุญแจ", "value") ไม่ทำงาน

วิธีหนึ่งในการทำเช่นนี้คือการสร้างพจนานุกรมปกติแล้วแปลงเป็น FormData:

var myFormData = {
    key1: 300,
    key2: 'hello world'
};

var fd = new FormData();
for (var key in myFormData) {
    console.log(key, myFormData[key]);
    fd.append(key, myFormData[key]);
}

หากคุณต้องการดีบักวัตถุ FormData ธรรมดาคุณสามารถส่งวัตถุนั้นเพื่อตรวจสอบในคอนโซลการร้องขอเครือข่าย:

var xhr = new XMLHttpRequest;
xhr.open('POST', '/', true);
xhr.send(fd);

นั่นเป็นความคิดที่ดีฉันจะห่อ FormData ด้วยวิธีผู้ช่วยแล้วส่งผ่านวัตถุตามตัวอักษร จากนั้นบันทึกในกรณีที่คุณต้องการดูในภายหลัง

2
รุ่นล่าสุดของโครเมี่ยมและ Firefox ตอนนี้ให้ iterator:myFormData.entries()
rloth

1
ในขณะที่เขียนไม่มีวิธีการเข้าถึง FormData ฉันได้อัปเดตคำตอบเพื่อให้สอดคล้องกับ API ใหม่แล้ว ขอบคุณสำหรับ heads up rloth!
Ryan Endacott

2
var formData = new FormData(formElement)ฉันคิดว่ามันยังมีประโยชน์ที่จะทราบว่าคุณสามารถคว้าข้อมูลเป็นรูปแบบที่มีอยู่โดยใช้: หากคุณกำลังใช้ JQuery var formData = new FormData($('#formElementID')[0])คุณจึงสามารถทำเช่นนี้: จากนั้นผนวกข้อมูลตามต้องการ
Peter Valadez

สำหรับการวนซ้ำFormDataใน IE / Edge: stackoverflow.com/questions/37938955/…
cs_pupil

79

คำตอบสั้น ๆ

console.log(...fd)

คำตอบอีกต่อไป

หากคุณต้องการตรวจสอบว่าร่างกายดิบมีลักษณะอย่างไรคุณสามารถใช้ตัวสร้างการตอบกลับ (ส่วนหนึ่งของการดึงข้อมูล API)

var fd = new FormData

fd.append("key1", "value1")
fd.append("key2", "value2")

new Response(fd).text().then(console.log)

บางส่วนของสินค้าที่ต้องการแนะนำให้เข้าสู่ระบบการเข้ามาของรายการแต่ละ แต่console.logยังสามารถใช้ข้อโต้แย้งหลาย
console.log(foo, bar)
เพื่อที่จะใช้หมายเลขใด ๆ ของการโต้แย้งคุณสามารถใช้วิธีการและเรียกมันว่าเป็นเช่น:apply แต่มีวิธีที่ ES6 ใหม่เพื่อใช้การขัดแย้งกับผู้ประกอบการแพร่กระจายและ iteratorconsole.log.apply(console, array)

console.log(...array)

เมื่อรู้อย่างนี้แล้วความจริงที่ว่า FormData และอาเรย์ทั้งสองนั้นมีSymbol.iteratorวิธีการในต้นแบบของมันคุณก็สามารถทำได้โดยไม่ต้องวนซ้ำหรือเรียก.entries()ให้ได้ตัววนซ้ำ

var fd = new FormData

fd.append("key1", "value1")
fd.append("key2", "value2")

console.log(...fd)


2
ผู้ประกอบการแพร่กระจาย !! ยอดเยี่ยมและเรียบง่ายจริงๆแสดง formdata เป็นรูปแบบ psuedo Json ขอบคุณ - สำหรับการตอบสนองใหม่ฉันเพิ่งได้รับ [[PromiseStatus]]: "รอดำเนินการ"
platinums

5
หรือจากเว็บคอนโซลเพิ่งเขียน[...fd]
Endless

hells bells - คุณทำมันอีกครั้ง @Endless วิธีการใดที่เรียกว่าการใช้วงเล็บ?
ลาตินั่ม

ดีวงเล็บเป็นเพียงอาร์เรย์และคุณกำลังสร้างใหม่ คุณกำลังกระจายรายการที่มี...จาก formdata เพื่อสร้างอาร์เรย์ใหม่ที่มีรายการทั้งหมดจากนั้นคอนโซลก็จะทิ้งผลลัพธ์จากบรรทัดสุดท้ายที่คุณเขียน
Endless

1
คำตอบที่ดีที่สุดที่นี่ - ควรลบ gumpf ทั้งหมดและเพียงปล่อยรหัสที่ 2 - ขอบคุณมาก
danday74

39

ฉันใช้formData.entries()วิธีการ ฉันไม่แน่ใจเกี่ยวกับการสนับสนุนเบราว์เซอร์ทั้งหมด แต่ทำงานได้ดีบน Firefox

ที่นำมาจากhttps://developer.mozilla.org/en-US/docs/Web/API/FormData/entries

// Create a test FormData object
var formData = new FormData();
formData.append('key1','value1');
formData.append('key2','value2');

// Display the key/value pairs
for (var pair of formData.entries())
{
 console.log(pair[0]+ ', '+ pair[1]); 
}

นอกจากนี้ยังมีformData.get()และformData.getAll()รองรับเบราว์เซอร์ที่กว้างขึ้น แต่จะแสดงเฉพาะค่าไม่ใช่คีย์ ดูลิงค์สำหรับข้อมูลเพิ่มเติม


3
ในที่สุดก็ง่ายที่จะมองเข้าไปในวัตถุ FormData! สิ่งนี้ใช้ได้สำหรับฉันหลังจากอัปเกรดเป็น Chrome 50 (เปิดตัวเมื่อวานวันที่ 13 เมษายน 2559)
jbb

2
คู่ var ของโยนข้อผิดพลาดสำหรับฉัน การแทนที่ด้วยinดูเหมือนจะพิมพ์อย่างน้อยที่สุดอย่างไรก็ตามไม่ใช่คีย์หรือค่าเช่นสถานะ MDN
Johnny Welker

1
ES6:for (const pair of formData.entries()) { console.log(pair[0], pair[1]); }
2540625

เพราะ ...เป็นES6คุณสมบัติและจะใช้งานได้ในเบราว์เซอร์บางประเภทเท่านั้น ไม่รวม IE เวอร์ชันใด ๆตาม MDN
Zanshin13

for of ไม่ได้รับการสนับสนุนใน IE ส่วนใหญ่ รองรับเฉพาะใน IE edge
mingca

11

ในบางกรณีการใช้:

for(var pair of formData.entries(){... 

เป็นไปไม่ได้

ฉันใช้รหัสนี้แทน:

var outputLog = {}, iterator = myFormData.entries(), end = false;
while(end == false) {
   var item = iterator.next();
   if(item.value!=undefined) {
       outputLog[item.value[0]] = item.value[1];
   } else if(item.done==true) {
       end = true;
   }
    }
console.log(outputLog);

มันไม่ใช่รหัสที่ฉลาดมาก แต่ใช้งานได้ ...

หวังว่ามันจะช่วยได้


1
ฉันจะกลับคำสั่ง if เพื่อตรวจสอบdoneก่อน doneเป็นธงที่เชื่อถือได้; ถ้าdoneเป็นเท็จหรือไม่ได้ระบุไว้ก็valueเป็นรายการที่ถูกต้อง (แม้ว่ามันจะเก็บค่าundefined) เมื่อถึงdoneปัจจุบันและtrueถึงจุดสิ้นสุดของลำดับและvalueไม่จำเป็นต้องกำหนด หากvalueมีการกำหนดไว้เมื่อdoneใดtrueดังนั้นvalueจะถูกตีความว่าเป็นค่าส่งคืนของตัววนซ้ำ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Triynko

10

เมื่อฉันกำลังทำงานกับ Angular 5+ (ด้วย TypeScript 2.4.2) ฉันลองดังต่อไปนี้และทำงานได้ยกเว้นข้อผิดพลาดการตรวจสอบแบบสแตติก แต่ยัง for(var pair of formData.entries())ไม่ทำงาน

formData.forEach((value,key) => {
      console.log(key+" "+value)
});

ตรวจสอบที่ Stackblitz


+ เข้ากันไม่ได้กับ IE (value, key) => {..11 ปวดหัว !
Delphine

1
ดี ต้องการให้ 10 ดาว
Abdullah Nurum

10

วิธีการง่าย ๆ

ฉันใช้รหัสนี้ในเชิงมุม 8

var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');

 formData.forEach((value,key) => {
    console.log(key+value)
     });

9

โซลูชัน ES6 +:

หากต้องการดูโครงสร้างของข้อมูลในฟอร์ม:

console.log([...formData])

วิธีดูคู่คีย์ - ค่าแต่ละรายการ:

for (let [key, value] of formData.entries()) {
  console.log(key, ':', value);
}

2

นี่คือฟังก์ชั่นเพื่อบันทึกรายการของวัตถุ FormData ไปยังคอนโซลเป็นวัตถุ

export const logFormData = (formData) => {
    const entries = formData.entries();
    const result = {};
    let next;
    let pair;
    while ((next = entries.next()) && next.done === false) {
        pair = next.value;
        result[pair[0]] = pair[1];
    }
    console.log(result);
};

เปิด MDN doc .entries()

MDN doc on .next()และ.done


2
  function abc(){ 
    var form = $('#form_name')[0]; 
        var formData = new FormData(form);
        for (var [key, value] of formData.entries()) { 
            console.log(key, value);
        }
        $.ajax({
            type: "POST",
            url: " ",
            data:  formData,
            contentType: false,
            cache: false,
            processData:false,
            beforeSend: function() {

            },
            success: function(data) {


            },

       });
}

+ เข้ากันไม่ได้กับ IE for...of..11 ปวดหัว !
Delphine

2

คุณต้องเข้าใจว่าผลตอบแทนตัวอย่างของFormData::entries()Iterator

ใช้แบบฟอร์มตัวอย่างนี้:

<form name="test" id="form-id">
    <label for="name">Name</label>
    <input name="name" id="name" type="text">
    <label for="pass">Password</label>
    <input name="pass" id="pass" type="text">
</form>

และ JS-loop นี้:

<script>
    var it = new FormData( document.getElementById('form-id') ).entries();
    var current = {};
    while ( ! current.done ) {
        current = it.next();
        console.info( current )
    }
</script>

2

ในเชิงมุม 7 ฉันได้รับรายการบนคอนโซลโดยใช้บรรทัดด้านล่างของรหัส

formData.forEach(entries => console.log(entries));

2

ตอบแล้ว แต่ถ้าคุณต้องการดึงค่าในวิธีที่ง่ายจากแบบฟอร์มที่ส่งคุณสามารถใช้ตัวดำเนินการสเปรดรวมกับการสร้าง Map iterable ใหม่เพื่อให้ได้โครงสร้างที่ดี

new Map([...new FormData(form)])


แม้ว่า - สิ่งนี้มีปัญหากับ inp_nam [some_mult] [] - มีเพียงคนสุดท้ายเท่านั้นที่เห็น
halfbit

2

ในtypeScriptจากangular 6รหัสนี้ทำงานสำหรับฉัน

var formData = new FormData();
formData.append('name', 'value1');
formData.append('name', 'value2');
console.log(formData.get('name')); // this is return first element value.

หรือสำหรับค่าทั้งหมด:

console.log(formData.getAll('name')); // return all values

1

ลองใช้ฟังก์ชั่นนี้:

function formDataToObject(formData) {
  return Array.from(formData.entries()).reduce((old, pair) => ({
    ...old,
    [pair[0]]: pair[1],
  }), {});
}

2
ในขณะที่ข้อมูลโค้ดนี้อาจเป็นโซลูชันรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ
Johan

0

MDN แสดงให้เห็นรูปแบบต่อไปนี้:

let formData = new FormData();
formData.append('name', 'Alex Johnson')
for(let keyValuePair of formData.entries()){
    console.log(keyValuePair); //has form ['name','Alex Johnson']
}

อีกทางเลือกหนึ่ง

for (let [key, value] of formData.entries()) {
 console.log(key, ':', value);
}

พิจารณาเพิ่มES + Polyfillsในกรณีที่เบราว์เซอร์หรือสภาพแวดล้อมไม่รองรับ JavaScript และ FormData API ล่าสุด

ฉันหวังว่านี่จะช่วยได้.


คุณทดสอบรหัสนี้ก่อนใช้งานหรือไม่ formData()ควรเป็นตัวพิมพ์ใหญ่ก่อน นอกจากนี้for ... of loopในบรรทัดที่ 3 ของคุณกำลังเรียก FormData.entries โดยปริยายคุณสามารถดูได้โดยการเรียกใช้new FormData()[Symbol.iterator]ในคอนโซล ในที่สุดถ้าคุณเรียกใช้สิ่งนี้ในเบราว์เซอร์เช่น Edge ซึ่งไม่รองรับ FormData.entries คุณจะได้รับผลลัพธ์ที่ไม่คาดคิดเช่นการพิมพ์ชื่อวิธีการที่มีอยู่ในวัตถุ FormData:>>> var data = new FormData(); data.append("Foo", "Bar"); for(let x in data){console.log(x)}; <<< 'append'
Lovethenakedgun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.