必要ならどうぞ。

デモ

jQueryでフォームの値を取得する方法をまとめ – jsdo.it – share JavaScript, HTML5 and CSS

共通:要素の探し方

input要素なんかにid振っちゃうのが一番なんだけど、属性セレクターを使うと楽な場合があります。つまり[name=xxx]で検索するやり方。

<form id="my-form">
  <input type="text" name="my-text" value="This is text." />
</form>
// id="my-form" の中から name="my-text" なものを検索
var $input = $('#my-form [name=my-text]');

[name=xxx]だけだとフォームが複数あるときに全部取ってきちゃうので、フォームの方にはidを振って、その中から探すようにしました。

テキスト

これが基本パターン。 .val()で得られます。

<form id="my-form">
  <input type="text" name="my-text" value="This is text." />
</form>
var val = $('#my-form [name=my-text]').val();
console.log(val);  // => "This is text."

数値

HTML5からtypenumberが追加されました。まあ今までもtextでやってきたと思うんですが、ともかく .val()するとstring型で返ってきます。数値の加算2+35になりますが、文字列"2"+"3""23"になっちゃいますからね。要注意。

で、取ってきた文字列をNumber()あたりで数値に変換してやれば大丈夫です。

<form id="my-form">
  <input type="number" name="my-number" value="123" />
</form>
var valText = $('#my-form [name=my-number]').val();
var val = Number(valText) || 0;  // NaNのとき0にする
console.log(val);  // => 123

「フォームの値の取り方」とはちょっと違うんだけど、まあ覚えておいてください。あと文字列から数値への変換は何パターンかありますので、興味あれば調べてみてくださいな。

ラジオボタン

値を取るという動作自体は単純に .val()で済むんだけど、現実的にやりたいのは選択されている値を取る、というのですよね。

というわけで、name属性で検索した後に:checkedで絞り込むというひと手間を加えます。

<form id="my-form">
  <input type="radio" name="my-radio" value="A" />
  <input type="radio" name="my-radio" value="B" checked />
  <input type="radio" name="my-radio" value="C" />
</form>
var val = $('#my-form [name=my-radio]:checked').val();
console.log(val);  // => "B"

あ、もちろん利用者が画面でぽちぽちして選択変えたら、そっちが得られますよ。

チェックボックス

これが面倒くさい。要素の探し方はラジオボタンと一緒なんだけれど、こっちは複数選択されている場合がある。jQueryは値の取得は先頭のものだけが対象になるのが普通で、 .val()もそう。

全部取るために、 .map()でループします。

<form id="my-form">
  <input type="checkbox" name="my-checkbox" value="A" />
  <input type="checkbox" name="my-checkbox" value="B" checked />
  <input type="checkbox" name="my-checkbox" value="C" checked />
</form>
var $checked = $('#my-form [name=my-checkbox]:checked');
var valList = $checked.map(function(index, el) { return $(this).val(); });
console.log(valList);  // => ["B", "C"]

複数あるかもなので、値も配列に詰めてます。

あ、 .map()の使い方は解説しないので、わからない人は探してみてくださいね。

んー、もっと良いやり方があるかもしれない。

セレクトボックス(単数)

HTMLはラジオボタンに似てるけど、選択されているoption要素を探す必要はなくて、単にselect要素の値を取ればOKです。

<form id="my-form">
  <select name="my-select">
    <option value="A">This is A</option>
    <option value="B" selected>This is B</option>
    <option value="C">This is C</option>
  </select>
</form>
var val = $('#my-form [name=my-select]').val();
console.log(val);  // => "B"

表示文字列が欲しいときは

"B"じゃなくて画面に表示されているやつ"This is B"が欲しいときは、option要素から探す事になります。

あと .val()じゃなくて .text()ね。

var text = $('#my-form [name=my-select] option:selected').text();
console.log(text);  // => "This is B"

フォーム送信してもサーバーに送られるものではないけれど、選択を画面に反映させたい場合に使えるかなと。

セレクトボックス(複数)

取り方は単数のときと一緒です。なんとなんと、ラジオボタンみたいにループで云々なんて不要! そのあたりはjQueryがやってくれます。便利だねぃ。

multiple属性のあるselect要素で .val()すると、選択値が配列で得られます。

<form id="my-form">
  <select name="my-multi-select" size="3" multiple>
    <option value="A">This is A</option>
    <option value="B" selected>This is B</option>
    <option value="C" selected>This is C</option>
  </select>
</form>
var val = $('#my-form [name=my-multi-select]').val();
console.log(val);  // => ["B", "C"]

ちなみに選択されてる数によらずに配列になるので、ひとつのときも何も選択されてないときも、配列です。

ファイル

これは無理!

昔は .val()で選択されているファイルのパスとか取れたんだけど、今はセキュリティのアレソレで駄目です。jQueryじゃなくてJavaScriptの方の問題ね。

どうしても必要ならHTML5のFile APIあたりを使います。本稿では触れません。

全部まとめて

フォームの値をまとめて全部取ってくる事も可能です。

form要素に対して .serialize()で送信するのと同じ文字列(URLの”?”以降の部分)が、 .serializeArray()でそれを配列に分解したものを得られます。

<form id="my-form">
  <input type="text" name="my-text" value="This is text." />
  <select name="my-multi-select" size="3" multiple>
    <option value="A">This is A</option>
    <option value="B" selected>This is B</option>
    <option value="C" selected>This is C</option>
  </select>
</form>
var $form = $('#my-form');
var query = $form.serialize();
var param = $form.serializeArray();
console.log(query);  // => "my-text=This+is+text.&my-multi-select=B&my-multi-select=C"
console.log(param);  // => [{name:"my-text",value:"This is text."},(省略)]

まとめて検証するときとか、個別に取ってくるよりこっちの方が楽かもしれない。

.serializeArray()は配列じゃなくてnameをキーにした連想配列だと扱いが楽だなーって思いました。複数あるものはvalueの方を配列にする感じで。まあいいけど。

おしまい。