JavaScript - pobieranie wartości formularza HTML


112

Jak uzyskać wartość formularza HTML do przekazania do JavaScript?

Czy to jest poprawne? Mój skrypt pobiera dwa argumenty, jeden z pola tekstowego, drugi z pola rozwijanego.

<body>
<form name="valform" action="" method="POST">

Credit Card Validation: <input type="text" id="cctextboxid" name="cctextbox"><br/>
Card Type: <select name="cardtype" id="cardtypeid">
  <option value="visa">Visa</option>
  <option value="mastercard">MasterCard</option>
  <option value="discover">Discover</option>
  <option value="amex">Amex</option>
  <option value="diners">Diners Club</option>
</select><br/>
<input type="button" name="submit" value="Verify Credit Card" onclick="isValidCreditCard(document.getElementById('cctextboxid').value,document.getElementById('cardtypeid').value)" />
</body>

2
Co dokładnie rozumiesz przez „wartość formularza w kodzie HTML”?
Pekka

7
pytanie jest całkiem jasne
laurentngu

1
@laurentngu pytanie brzmi, ma na myśli „wartość z formularza HTML”, czyli jedną wartość się z wielu wartości, czy on myśli „ wartość całego formularza HTML”, co oznacza wszystkie wartości w jednym wielkim „szeregowane wartość
bluejayke

Pytanie jest jasne ... ale najwyraźniej nie ma sensu przekazywać wartości formularza.
Matthew

Odpowiedzi:


112

HTML:

<input type="text" name="name" id="uniqueID" value="value" />

JS:

var nameValue = document.getElementById("uniqueID").value;

7
@ shorty876: Czy sam to przetestowałeś? o_0 To byłby całkiem dobry sposób ustalenia, czy zrobiłeś to dobrze.
Jeff Rupert

1
Tak, ale po prostu zwraca prawdę / fałsz i nie jestem pewien, jak określić, czy funkcja została w ogóle wywołana. W ten sposób możesz pomóc.
user377419

Wypróbowałem to, ale nameValuejest to wartość domyślna, a nie to, co wprowadził użytkownik.
James T.

dlaczego nazwa = "imię", a co, jeśli w ogóle nie ma identyfikatora?
bluejayke

65

Jeśli chcesz pobrać wartości formularza (takie jak te, które zostałyby wysłane za pomocą HTTP POST), możesz użyć:

JavaScript

const formData = new FormData(document.querySelector('form'))
for (var pair of formData.entries()) {
  // console.log(pair[0] + ': ' + pair[1]);
}

form-serialize ( https://code.google.com/archive/p/form-serialize/ )

serialize(document.forms[0]);

jQuery

$("form").serializeArray()

12
Twój pierwszy przykład FormDatasam w sobie nic nie robi… nadal musisz pobrać wartości z formularza.
putvande

1
Uważam, że to nieprawda. Jeśli podczas inicjowania FormData określisz element formularza, wówczas poprawnie pobierze wartości. codepen.io/kevinfarrugia/pen/Wommgd
Kevin Farrugia

2
Obiekt FormData sam nie jest jednak wartościami. Nadal musisz wywoływać i iterować FormData.entries(), aby pobrać wartości. Ponadto FormData.entries()nie jest dostępny w Safari, Explorer ani Edge. developer.mozilla.org/en-US/docs/Web/API/FormData
dave

1
Poprawne pod względem zgodności z przeglądarkami, jednak istnieją wypełnienia . Jeśli chodzi o iterację formData.entries(), zależy to od tego, czego szukasz. Jeśli szukasz wartości pojedynczego pola, możesz użyć formData.get(name). Odniesienie: get () .
Kevin Farrugia

Tak, nie mogę FormDatanic wydrukować w Chrome.
Atav32

33

Oto przykład z W3Schools:

function myFunction() {
    var elements = document.getElementById("myForm").elements;
    var obj ={};
    for(var i = 0 ; i < elements.length ; i++){
        var item = elements.item(i);
        obj[item.name] = item.value;
    }

    document.getElementById("demo").innerHTML = JSON.stringify(obj);
}

Demo można znaleźć tutaj .


12
Tylko ostrzeżenie, jeśli ktoś chce uzyskać wybrane wartości innych typów danych wejściowych, takich jak przyciski radiowe lub pola wyboru, nie zrobi to, co chcesz.
Sean

Musiałem zmienić var obj = {};się var obj = [];.
Daniel Williams

@Sean, dlaczego nie miałoby to działać w przypadku przycisków radiowych? Pojawiają się one również pod właściwością elementów
bluejayke

@bluejayke Kod będzie przechodził przez wszystkie wejścia przycisków opcji i zapisze „wartość” ostatniego przycisku opcji obj, niezależnie od tego, który z nich zostanie wybrany. Problem został przedstawiony tutaj (wybierz „Opcja 1”) w3schools.com/code/tryit.asp?filename=GEZXJXBBI7AW
Sean

29

document.formsbędzie zawierać tablicę formularzy na Twojej stronie. Możesz przeglądać te formularze, aby znaleźć żądaną formę.

var form = false;
var length = document.forms.length;
for(var i = 0; i < length; i++) {
    if(form.id == "wanted_id") {
        form = document.forms[i];
    }
}

Każdy formularz ma tablicę elementów, przez którą można przejść w pętli, aby znaleźć żądane dane. Powinieneś także mieć do nich dostęp z nazwy

var wanted_value = form.someFieldName.value;
jsFunction(wanted_value);

Dlaczego najpierw nie wspomniano o krótszej metodzie? = -D
Klesun

2
@ArturKlesun Wydaje mi się, że to dlatego, że dziesięć lat temu zacząłem wpisywać odpowiedź, OP nie był aktualizowany, więc napisałem pętlę for, aby poradzić sobie z większością sytuacji. Myślę, że wtedy zapewniałem również zgodność przeglądarki z IE7, ponieważ nie mieliśmy o wiele lepszego krajobrazu, jaki mamy dzisiaj.
Codeacula

5

Moje 5 centów tutaj, za pomocą form.elementsktórych możesz sprawdzać każde pole według jegoname , a nie tylko iteracji:

const form = document.querySelector('form[name="valform"]');
const ccValidation = form.elements['cctextbox'].value;
const ccType = form.elements['cardtype'].value;

2

Rozwijając pomysł Atrura Klesuna ... możesz po prostu uzyskać do niego dostęp po nazwie, jeśli użyjesz getElementById, aby przejść do formularza. W jednej linii:

document.getElementById('form_id').elements['select_name'].value;

Użyłem go tak do przycisków radiowych i działało dobrze. Myślę, że tutaj jest tak samo.


2

To jest rozwinięty przykład https://stackoverflow.com/a/41262933/2464828

Rozważać

<form method="POST" enctype="multipart/form-data" onsubmit="return check(event)">
    <input name="formula">
</form>

Załóżmy, że chcemy pobrać dane wejściowe nazwy formula. Można to zrobić poprzez przepuszczanie eventw onsubmitpolu. Następnie możemy użyć FormDatado pobrania wartości tej dokładnej formy, odwołując się do SubmitEventobiektu.

const check = (e) => {
    const form = new FormData(e.target);
    const formula = form.get("formula");
    console.log(formula);
    return false
};

Powyższy kod JavaScript wydrukuje wartość danych wejściowych na konsoli.

Jeśli chcesz iterować wartości, tj. Pobrać wszystkie wartości, zobacz https://developer.mozilla.org/en-US/docs/Web/API/FormData#Methods


Wspaniały!. Właśnie tego potrzebuję. Dziękuję Ci.
Dang Cong Duong


1

Spróbuj zmienić kod jak poniżej:

<form
   onSubmit={e => {
     e.preventDefault();
     e.stopPropagation();

     const elements = Array.from(e.currentTarget) as HTMLInputElement[];

     const state = elements.reduce((acc, el) => {
       if (el.name) {
         acc[el.name] = el.value;
       }

       return acc;
     }, {});

     console.log(state); // {test: '123'}
   }}
>
   <input name='test' value='123' />
</form>

Dzięki, twój doskonały kod i działa dla mnie!
LI HO TAN

0

Szybkie rozwiązanie do serializacji formularza bez żadnych bibliotek

function serializeIt(form) {
  return (
    Array.apply(0, form.elements).map(x => 
      (
        (obj => 
          (
            x.type == "radio" ||
            x.type == "checkbox"
          ) ?
            x.checked ? 
              obj
            : 
              null
          :
            obj
        )(
          {
            [x.name]:x.value
          }
        )
      )
    ).filter(x => x)
  );
}

function whenSubmitted(e) {
  e.preventDefault()
  console.log(
    JSON.stringify(
      serializeIt(document.forms[0]),
      4, 4, 4
    )
  )
}
<form onsubmit="whenSubmitted(event)">
<input type=text name=hiThere value=nothing>
<input type=radio name=okRadioHere value=nothin>
<input type=radio name=okRadioHere1 value=nothinElse>
<input type=radio name=okRadioHere2 value=nothinStill>

<input type=checkbox name=justAcheckBox value=checkin>
<input type=checkbox name=justAcheckBox1 value=checkin1>
<input type=checkbox name=justAcheckBox2 value=checkin2>

<select name=selectingSomething>
<option value="hiThere">Hi</option>
<option value="hiThere1">Hi1</option>
<option value="hiThere2">Hi2</option>
<option value="hiThere3">Hi3</option>
</select>
<input type=submit value="click me!" name=subd>
</form>


-1
<input type="text" id="note_text" />

let value = document.getElementById("note_text").value;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.