ピュアな JavaScript でフォーム(form)系要素の値を取得, 設定する方法一覧

phi phi on javascript, html

先日書いた

サーバーだけに頼る時代は終わった!? クライアントサイドでしっかり Validation する方法 | phiary

がありがたいことに好評だったので今回も form について書こうと思います.

はじめに

form 値 取得』とかで検索すると

  • for 文で一通りチェックして...
  • jQuery で要素を取得して val() で...

ってのがヒットしますよね?

これらの方法でも全然問題ないんですが, ピュアな JavaScript でもわりとスマートに値を取得, 設定することができます.

っということで今回は, フォーム系要素の値をピュアな JavaScript で取得, 設定する方法を一通りまとめてみました. よかったら参考にしてください.

デモ

まずはデモです. 一通り form を並べてそれぞれ設定, 取得を行っています. console に各要素の値が表示されているのがわかるかと思います.

コード

デモのコードです.

HTML

<form name='mainForm'>  
  <div>
    <h3>text</h3>
    <input name='_text' type='text' value='' />
  </div>
  <div>
    <h3>radio</h3>
    <input name='_radio' type='radio' value='hoge' /> hoge
    <input name='_radio' type='radio' value='foo' /> foo
    <input name='_radio' type='radio' value='bar' /> bar
  </div>
  <div>
    <h3>checkbox</h3>
    <input name='_checkA' type='checkbox' /> A
    <input name='_checkB' type='checkbox' /> B
  </div>
  <div>
    <h3>select</h3>
    <select name='_select'>
      <option value='hoge'>hoge</option>
      <option value='foo'>foo</option>
      <option value='bar'>bar</option>
    </select>
  </div>
  <div>
    <h3>textarea</h3>
    <textarea name='_ta'></textarea>
  </div>
  <div>
    <h3>file</h3>
    <input name='_file' type='file' />
  </div>
</form>  

JavaScript

window.onload = function() {  
  // TODO: write code
  // console.log("Hello, runstant!");
  var form = document.forms.mainForm;
  // text
  form._text.value = 'Hello, Vanilla JS';
  console.log('text:', form._text.value); //=> text: Hello, Vanilla JS
  // radio
  form._radio.value = 'foo';
  console.log('radio:', form._radio.value); //=> radio: foo

  // checkbox
  form._checkB.checked = true;
  console.log('checkbox:', 'A=' + form._checkA.checked, 'B=' + form._checkB.checked); //=> checkbox: A=false B=true

  // selectbox
  form._select.value = 'bar';
  console.log('select:', form._select.value); //=> select: bar

  // textarea
  form._ta.value = 'コード書きたい';
  console.log('textarea:', form._ta.value); //=> textarea: コード書きたい

  // file
  form._file.onchange = function() {
    var file = form._file.files[0];

    var fr = new FileReader();
    fr.onload = function(res) {
      console.log(fr.result); // ファイルの中身を表示
    };
    fr.readAsText(file);
  };
};

form 要素の取得

form タグに name 属性をつけると documents.forms にプロパティとして追加されます.
これを利用することで query を使わずに要素にアクセスすることができます.

HTML

<form name='mainForm'> ~ </form>  

JavaScript

var form = document.forms.mainForm;  

この form 経由で各要素にアクセスしていきます.

テキスト

ss

最も定番な form 系要素ですね.

HTML

name 属性を付けることで form 経由でアクセスすることができるようになります.

<input name='_text' type='text' value='' />  

JavaScript - Setter

value プロパティに値を入れることで反映されます.

form._text.value = 'Hello, Vanilla JS';  

JavaScript - Getter

同じく value プロパティで取得できます.

console.log('text:', form._text.value); //=> text: Hello, Vanilla JS  

ラジオボタン

ss

HTML

同じ名前を指定しておくことで排他的に1つだけ選択できるようになります.

<input name='_radio' type='radio' value='hoge' /> hoge  
<input name='_radio' type='radio' value='foo' /> foo  
<input name='_radio' type='radio' value='bar' /> bar  

JavaScript - Setter

よく for 文で回して各要素から checked === true のものを探してっていう tips を見ますが, 実はこれ, form 経由だと簡単に値を取得できます. 同じ名前の <input type='radio' /> があった場合, それらの要素は form に RadioNodeList として 登録されます.

これは配列ライクなオブジェクトですが, value というプロパティを持っており value にアクセスするだけでラジオボタンの値を設定, 取得することができます.

form._radio.value = 'foo';  

JavaScript - Getter

Setter 同じく RadioNodeList の value 経由で設定できます.

console.log('radio:', form._radio.value); //=> radio: foo  

チェックボックス

ss

HTML

<input name='_checkA' type='checkbox' /> A  
<input name='_checkB' type='checkbox' /> B  

JavaScript - Setter

checked プロパティに bool 値を渡すことで設定できます.

form._checkB.checked = true;  

JavaScript - Getter

console.log('checkbox:', 'A=' + form._checkA.checked, 'B=' + form._checkB.checked); //=> checkbox: A=false B=true  

セレクトボックス

ss

HTML

<select name='_select'>  
  <option value='hoge'>hoge</option>
  <option value='foo'>foo</option>
  <option value='bar'>bar</option>
</select>  

JavaScript - Setter

form._select.value = 'bar';  

JavaScript - Getter

console.log('select:', form._select.value); //=> select: bar  

テキストエリア

ss

テキストとほとんど同じですね.

HTML

<textarea name='_ta'></textarea>  

JavaScript - Setter

form._ta.value = 'コード書きたい';  

JavaScript - Getter

console.log('textarea:', form._ta.value); //=> textarea: コード書きたい  

ファイル

ss

テキストとほとんど同じですね.

HTML

<input name='_file' type='file' />  

JavaScript - Setter

設定はセキュリティの関係上 JavaScript ではできません.

JavaScript - Getter

選択したファイル情報は file 要素の files に格納されます. FileReader を使うことで選択したファイルの中身にアクセスすることができます.

form._file.onchange = function() {  
  var file = form._file.files[0];

  var fr = new FileReader();
  fr.onload = function(res) {
    console.log(fr.result); // ファイルの中身を表示
  };
  fr.readAsText(file);
};

おわりに

基礎的なことばかりですが, jQuery に頼りがちだったり無理くりやってて知らなかったこともあったのではないでしょうか? ブラウザごとの差分もだいぶなくなり, ピュアな JavaScript でも安心してコードを書ける時代が来つつあります.

課題にぶつかったとき, 安易にライブラリに頼るのではなく一度立ち止まって今の環境でも解決できないか模索してみるのも良いかもしれませんね.