Làm thế nào để kiểm tra FormData?


220

Tôi đã thử console.logvà lặp qua nó bằng cách sử dụng for in.

Đây là Tài liệu tham khảo MDN trên FormData.

Cả hai nỗ lực là trong fiddle này .

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);
}

Làm cách nào tôi có thể kiểm tra dữ liệu biểu mẫu để xem khóa nào đã được đặt.


Nó không phải là một tính năng chỉ firefox?
Shiplu Mokaddim


1
Bạn muốn làm key of fdthay vì key in fd. Tôi không biết tại sao điều này là về mặt kỹ thuật, nhưng nó hoạt động. Tài liệu ở đây .
cilphex

Vì vậy, không có plugin chrome hoặc firefox để hiển thị dữ liệu biểu mẫu mà không cần thêm bất kỳ mã nào vào javascript của bạn?
natel

Câu trả lời:


298

Phương pháp cập nhật:

Kể từ tháng 3 năm 2016, các phiên bản gần đây của Chrome và Firefox hiện hỗ trợ sử dụng FormData.entries()để kiểm tra FormData. Nguồn .

// 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]); 
}

Cảm ơn Ghost Echorloth đã chỉ ra điều này!

Câu trả lời cũ:

Sau khi xem các bài viết trên Mozilla này , có vẻ như không có cách nào để lấy dữ liệu ra khỏi một đối tượng FormData. Bạn chỉ có thể sử dụng chúng để xây dựng FormData để gửi qua yêu cầu AJAX.

Tôi cũng vừa tìm thấy câu hỏi này nói lên điều tương tự: FormData.append ("key", "value") không hoạt động .

Một cách để giải quyết vấn đề này là xây dựng một từ điển thông thường và sau đó chuyển đổi nó thành 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]);
}

Nếu bạn muốn gỡ lỗi một đối tượng FormData đơn giản, bạn cũng có thể gửi nó để kiểm tra nó trong bảng điều khiển yêu cầu mạng:

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

Chà, đó sẽ là một ý tưởng tốt, tôi sẽ bọc FormData theo một phương thức trợ giúp và sau đó chuyển vào đối tượng theo nghĩa đen. Sau đó lưu nó trong trường hợp bạn muốn xem xét nó sau.

2
Các phiên bản gần đây của chrome và firefox hiện cung cấp trình lặp:myFormData.entries()
rloth

1
Tại thời điểm viết bài, không có cách nào để truy cập FormData. Bây giờ tôi đã cập nhật câu trả lời để phản ánh API mới. Cảm ơn cho những người đứng đầu rloth!
Ryan Endacott

2
Tôi nghĩ cũng hữu ích khi lưu ý rằng bạn có thể lấy dữ liệu của biểu mẫu hiện có bằng cách sử dụng : var formData = new FormData(formElement). Nếu bạn đang sử dụng JQuery, do đó bạn có thể làm điều này : var formData = new FormData($('#formElementID')[0]). Sau đó nối dữ liệu khi cần thiết.
Peter Valadez

Để lặp lại FormDatatrong IE / Edge: stackoverflow.com/questions/37938955/
Kẻ

78

Câu trả lời ngắn

console.log(...fd)

Câu trả lời dài hơn

Nếu bạn muốn kiểm tra phần thân thô trông như thế nào thì bạn có thể sử dụng hàm tạo Phản hồi (một phần của API tìm nạp)

var fd = new FormData

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

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

Một số điều ước đề nghị ghi nhật ký từng mục nhập, nhưng console.logcũng có thể lấy nhiều đối số
console.log(foo, bar)
Để lấy bất kỳ số lượng đối số nào bạn có thể sử dụng applyphương thức và gọi nó như sau : console.log.apply(console, array).
Nhưng có một cách ES6 mới để áp dụng các đối số với toán tử trải rộng và iterator
console.log(...array).

Biết được điều này, và thực tế là FormData và cả hai mảng đều có một Symbol.iteratorphương thức trong nguyên mẫu của nó, bạn chỉ có thể thực hiện điều này mà không cần phải lặp lại nó, hoặc gọi .entries()để có được sự lặp lại của trình vòng lặp

var fd = new FormData

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

console.log(...fd)


2
điều hành lây lan !! Tuyệt vời và thực sự đơn giản, hiển thị formdata dưới định dạng psuedo Json. Cảm ơn - về Phản hồi mới, tôi chỉ nhận được [[PromiseStatus]]: "đang chờ xử lý"
bạch kim

5
Hoặc từ bảng điều khiển web chỉ cần viết[...fd]
Vô tận

tiếng chuông địa ngục - bạn đã làm lại @Endless. phương pháp nào được gọi là sử dụng dấu ngoặc?
bạch kim

tốt, dấu ngoặc chỉ là một mảng và bạn đang tạo một cái mới. Bạn đang trải đều các mục với ...từ formdata để tạo mảng mới với tất cả các mục, sau đó bảng điều khiển chỉ cần kết quả từ dòng cuối cùng bạn đã viết
Endless

1
câu trả lời tốt nhất ở đây - nên xóa tất cả các gumpf và chỉ để lại đoạn mã thứ 2 - cảm ơn nhiều
danday74

39

Tôi sử dụng formData.entries()phương pháp. Tôi không chắc chắn về tất cả các hỗ trợ trình duyệt, nhưng nó hoạt động tốt trên Firefox.

Lấy từ 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]); 
}

Ngoài ra còn có formData.get()formData.getAll()với sự hỗ trợ trình duyệt rộng hơn, nhưng chúng chỉ đưa ra các Giá trị chứ không phải Khóa. Xem liên kết để biết thêm.


3
Cuối cùng cũng dễ dàng nhìn vào các đối tượng FormData! Điều này làm việc cho tôi sau khi nâng cấp lên Chrome 50 (phát hành ngày hôm qua, 13 tháng 4 năm 2016).
jbb

2
var cặp của ném lỗi cho tôi. Thay thế nó bằng in dường như in ít nhất một cái gì đó, tuy nhiên nó không phải là khóa hoặc giá trị như trạng thái MDN.
Johnny Welker

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

cho ... củaES6tính năng và nó sẽ chỉ hoạt động trong một số trình duyệt nhất định. Không bao gồm bất kỳ phiên bản IE nào theo MDN
Zanshin13

cho không được hỗ trợ trong hầu hết IE. chỉ được hỗ trợ trong IE edge
mingca 20/03/18

11

Trong một số trường hợp nhất định, việc sử dụng:

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

là không thể

Tôi đã sử dụng mã này để thay thế:

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);

Nó không phải là một mã rất thông minh, nhưng nó hoạt động ...

Hy vọng nó sẽ giúp.


1
Tôi sẽ lật câu lệnh if để nó kiểm tra donetrước. donelà cờ có thẩm quyền; nếu donelà sai hoặc không được chỉ định, thì đó valuelà một mục hợp lệ (ngay cả khi nó giữ giá trị undefined). Khi nào donecó mặt và true, kết thúc chuỗi đã đạt được, và valuethậm chí không phải xác định. Nếu valueđược định nghĩa khi donetrue, thì valueđược hiểu là giá trị trả về của iterator. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/iêu
Triynko

10

Khi tôi đang làm việc trên Angular 5+ (với TypeScript 2.4.2), tôi đã thử như sau và nó hoạt động trừ lỗi kiểm tra tĩnh nhưng cũng for(var pair of formData.entries())không hoạt động.

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

Kiểm tra tại Stackblitz


+ không tương thích với IE 11 (value, key) => {... Đau đầu !
Delphine

1
đẹp. muốn cho bạn 10 sao.
Abdullah Nurum

10

Phương pháp dễ dàng

Tôi đã sử dụng mã này trong góc 8

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

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

9

Giải pháp ES6 +:

Để xem cấu trúc của dữ liệu biểu mẫu:

console.log([...formData])

Để xem từng cặp khóa-giá trị:

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

2

Đây là một chức năng để ghi nhật ký các mục của đối tượng FormData vào bàn điều khiển dưới dạng đối tượng.

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);
};

Tài liệu MDN trên .entries()

Tài liệu MDN trên .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) {


            },

       });
}

+ không tương thích với IE 11 for...of... Đau đầu !
Delphine

2

Bạn phải hiểu rằng FormData::entries()trả về một thể hiện của Iterator.

Lấy mẫu ví dụ này:

<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>

và vòng lặp JS này:

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

2

Trong góc 7 tôi có các mục trên bàn điều khiển bằng cách sử dụng dòng mã bên dưới.

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

2

Đã trả lời nhưng nếu bạn muốn truy xuất các giá trị một cách dễ dàng từ một biểu mẫu đã gửi, bạn có thể sử dụng toán tử trải rộng kết hợp với việc tạo một Bản đồ lặp mới để có được cấu trúc đẹp.

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


mặc dù - điều này có vấn đề với inp_nam [some_mult] [] - chỉ nhìn thấy lần cuối cùng
nửa phút

2

trong typeScriptcủa angular 6, mã này đang làm việc cho tôi.

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

hoặc cho tất cả các giá trị:

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

1

Hãy thử chức năng này:

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

2
Mặc dù đoạn mã này có thể là giải pháp, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
Johan

0

Các MDN cho thấy các hình thức sau đây:

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

Hoặc

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

Xem xét thêm ES + Polyfills , trong trường hợp trình duyệt hoặc môi trường không hỗ trợ API JavaScript và FormData mới nhất.

Tôi hi vọng cái này giúp được.


Bạn đã kiểm tra mã này trước khi chạy nó? formData()nên được viết hoa, trước hết. Ngoài ra, for ... of looptrong dòng 3 của bạn đang ngầm gọi FormData.entries, bạn có thể thấy điều này bằng cách chạy new FormData()[Symbol.iterator]trong bảng điều khiển. Cuối cùng, nếu bạn chạy nó trong các trình duyệt như Edge, không hỗ trợ FormData.entries, bạn sẽ nhận được kết quả không mong muốn, chẳng hạn như in tên phương thức có sẵn trên đối tượng FormData:>>> var data = new FormData(); data.append("Foo", "Bar"); for(let x in data){console.log(x)}; <<< 'append'
Lovethenakengun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.