FormData nasıl incelenir?


221

Denedim console.logve kullanarak döngü for in.

Burada FormData MDN başvurusu .

Her iki girişim de bu kemanın içindedir .

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

Hangi tuşların ayarlandığını görmek için form verilerini nasıl inceleyebilirim.


Yalnızca bir Firefox özelliği değil mi?
Shiplu Mokaddim


1
Bunun key of fdyerine yapmak istersiniz key in fd. Bunun neden teknik olarak henüz olduğunu bilmiyorum, ama işe yarıyor. Belgeler burada .
cilphex

Yani, javascriptinize herhangi bir kod eklemeden form verilerini göstermek için chrome veya firefox eklentisi yok mu?
natel

Yanıtlar:


298

Güncellenmiş Yöntem:

Mart 2016 itibariyle, Chrome ve Firefox'un son sürümleri artık FormData.entries()FormData'yı denetlemek için kullanmayı destekliyor. Kaynak .

// 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 ve bunu işaret ettiği için rloth sayesinde !

Eski Cevap:

Bu Mozilla makalelerine baktıktan sonra FormData nesnesinden veri almanın bir yolu yok gibi görünüyor. Bunları yalnızca bir AJAX isteği yoluyla göndermek üzere FormData oluşturmak için kullanabilirsiniz.

Ayrıca sadece aynı şeyi bildiren bu soruyu buldum: FormData.append ("anahtar", "değer") çalışmıyor .

Bunun bir yolu düzenli bir sözlük oluşturmak ve daha sonra FormData dönüştürmek olacaktır:

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

Düz bir FormData nesnesinde hata ayıklamak istiyorsanız, bunu ağ istek konsolunda incelemek için de gönderebilirsiniz:

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

Eh, bu iyi bir fikir olurdu, ben bir yardımcı yöntemde FormData sarın ve sonra nesne değişmezi geçmek. Daha sonra bakmak istediğinizde kaydedin.

2
chrome ve firefox'un son sürümleri artık bir yineleyici sağlıyor:myFormData.entries()
rloth

1
Yazma sırasında FormData'ya erişmenin bir yolu yoktu. Şimdi cevabı yeni API'yı yansıtacak şekilde güncelledim. Head up rloth için teşekkürler!
Ryan Endacott

2
Ben bunu kullanarak mevcut formun verileri yakalar dikkat etmek de yararlıdır olduğunu düşünüyorum: var formData = new FormData(formElement). Eğer JQuery kullanıyorsanız, bu nedenle bunu yapabilirsiniz: var formData = new FormData($('#formElementID')[0]). Ardından verileri gerektiği gibi ekleyin.
Peter Valadez

FormDataIE / Edge'de yineleme için: stackoverflow.com/questions/37938955/…
cs_pupil

79

Kısa cevap

console.log(...fd)

Daha uzun cevap

Ham gövdenin nasıl görüneceğini incelemek isterseniz, Yanıt yapıcısını (getirme API'sinin bir parçası) kullanabilirsiniz

var fd = new FormData

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

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

Dilek Bazı girişlerin her girişi yapmanızı öneririz ama console.logaynı zamanda birden fazla bağımsız alabilir
console.log(foo, bar)
sen kullanabilirsiniz argüman herhangi bir sayıda çekmek için applyyöntem ve bu şekilde diyoruz: console.log.apply(console, array).
Ancak, yayılma işleci ve yineleyici ile bağımsız değişkenler uygulamanın yeni bir ES6 yolu vardır
console.log(...array).

Bunu bilerek, Ve FormData ve her iki dizinin Symbol.iteratorprototipinde bir yöntemi olduğu gerçeği, bunu sadece döngü yapmak zorunda kalmadan veya .entries()yineleyiciyi tutmak için çağırmadan yapabilirsiniz .

var fd = new FormData

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

console.log(...fd)


2
yayılan operatör !! Mükemmel ve gerçekten basit, form verilerini psuedo Json formatı olarak görüntüler. Teşekkürler - Yeni Yanıt için, ben sadece [[PromiseStatus]]: "beklemede"
platin

5
Veya web konsolundan yazabilirsiniz[...fd]
Endless

cehennem çanları - sen yine @Endless yaptı. parantez kullanmak için hangi yöntem denir?
platin

parantezler sadece bir dizidir ve yeni bir tane oluşturuyorsunuz. ...Tüm öğelerle yeni bir dizi oluşturmak için formdata ile girdileri yayıyorsunuz, sonra konsol sadece yazdığınız son satırdan sonucu döküyor
Endless

1
burada en iyi cevap - tüm gumpf kaldırmak ve sadece 2. kod snippet'i terk etmelisiniz - çok teşekkürler
danday74

39

I kullanma formData.entries()yöntemi. Tüm tarayıcı desteğinden emin değilim, ancak Firefox'ta iyi çalışıyor.

Alındığı 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]); 
}

Ayrıca formData.get()ve formData.getAll()daha geniş tarayıcı desteği var, ancak Anahtar değil sadece Değerleri getiriyorlar. Daha fazla bilgi için bağlantıya bakın.


3
Sonunda FormData nesnelerine bakmak kolaydır! Bu, Chrome 50'ye yükselttikten sonra benim için çalıştı (13 Nisan 2016'da yayınlandı).
jbb

2
var çifti arasında benim için hataları atar. İle değiştirilmesi halinde ise en azından bir şeyler yazdırmak görünüyor MDN ülkenin olduğu gibi onun değil bir tuşa veya değeri.
Johnny Welker

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

ve ... için olan ES6özellik ve sadece belirli tarayıcılarda çalışır. MDN'ye göre
Zanshin13 12

için çoğu IE'de desteklenmez. sadece IE kenarında desteklenir
mingca

11

Bazı durumlarda, aşağıdakilerin kullanımı:

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

imkansız.

Bu kodu yerine kullandım:

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

Çok akıllı bir kod değil, ama işe yarıyor ...

Umarım yardım eder.


1
doneÖnce kontrol etmek için if deyimini çeviririm . doneyetkili bayraktır; eğer donebelirtilen sahte ya da değil, o zaman valuegeçerli bir öğe (bu değeri tutan bile olduğunu undefined). Ne zaman donemevcut ve truesekansın sonuna ulaşılmıştır ve valuetanımlanması bile gerekmez. Eğer valuezaman tanımlanmaktadır doneolup true, daha sonra valueYineleyici dönüş değeri olarak yorumlanır. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Triynko

10

Angular 5+ (TypeScript 2.4.2 ile) üzerinde çalışırken, aşağıdaki gibi denedim ve statik bir kontrol hatası dışında çalışıyor ama aynı zamanda for(var pair of formData.entries())çalışmıyor.

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

Stackblitz'e bakın


+ IE 11 ile uyumlu değildir (value, key) => {... Baş ağrısı !
Delphine

1
Güzel. Sana 10 yıldız vermek istiyorum.
Abdullah Nurum

10

Kolay Yöntem

Bu kodu açısal 8'de kullandım

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

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

9

ES6 + çözümleri:

Form verilerinin yapısını görmek için:

console.log([...formData])

Her bir anahtar / değer çiftini görmek için:

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

2

FormData nesnesinin girişlerini bir nesne olarak konsola kaydetmek için bir işlev.

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 dokümanı .entries()

MDN dokümanı .next()ve.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 11 ile uyumlu değildir for...of... Baş ağrısı !
Delphine

2

Bunun FormData::entries()bir örneğini döndürdüğünü anlamalısınız Iterator.

Bu örnek formu alın:

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

ve bu JS döngüsü:

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

2

Açısal 7'de aşağıdaki kod satırını kullanarak konsolda girişler aldım.

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

2

Zaten yanıtlandı, ancak gönderilen bir formdan değerleri kolay bir şekilde almak istiyorsanız, güzel bir yapı elde etmek için yeni bir Harita oluşturulabilir ile birlikte forma operatörünü kullanabilirsiniz.

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


rağmen - bu inp_nam [some_mult] [] ile ilgili bir Sorun var - sadece son görülüyor
halfbit

2

içinde typeScriptbir angular 6, bu kod benim için çalışıyor.

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

veya tüm değerler için:

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

1

Bu işlevi deneyin:

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

2
Bu kod snippet'i çözüm olsa da, bir açıklama da dahil olmak üzere mesajınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
Johan

0

MDN göstermektedir şu formu:

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

alternatif olarak

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

Eklemeyi düşünün ES + Polyfills , durumunda tarayıcı veya çevre son JavaScript ve FormData API desteklemez.

Umarım bu yardımcı olur.


Bu kodu çalıştırmadan önce test ettiniz mi? formData()öncelikle büyük harfle yazılmalıdır. Ayrıca, for ... of loopsatır 3'te örtük olarak FormData.entries çağırıyor, bunu çalıştırarak görebilirsiniznew FormData()[Symbol.iterator] konsolda . Son olarak, bunu FormData.entries'i desteklemeyen Edge gibi tarayıcılarda çalıştırırsanız, FormData nesnesindeki kullanılabilir yöntem adlarını yazdırma gibi beklenmedik sonuçlar elde edersiniz:>>> var data = new FormData(); data.append("Foo", "Bar"); for(let x in data){console.log(x)}; <<< 'append'
Lovethenakedgun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.