DOMによるフォーム・コントロールの操作 (4/6)
作成:2010-04-02 15:00
更新:2010-05-11 18:45
更新:2010-05-11 18:45
■ラジオボタンを巡る2通りのやり方
テキストを入力する関係のフォーム・コントロールは、それほど扱いは難しくありません。<input type="text">関係は先にやったようにvalueで値を取り出せますし、<textarea>はinnerHTMLで値が得られます。
チェックボックスである<input type="checkbox">は、「checked」というプロパティでチェックされた状態を知ることができます。ところが、注意しないといけないのは、似ているようで違う「ラジオボタン」です。これもやはりON/OFFするコントロールですが、「複数の中から1つを選ぶ」という働きをするものですから、実はON/OFFではなく「選択」のコントロールなのです。従って、「いくつかあるラジオボタンの中から、選択されたものを探し出す」というやり方を考える必要があります。
まず、正統的?なやり方からです。ラジオボタンは、同じグループ(クリックして1つを選ぶ仲間たち)のものはすべて同じ名前(name属性)をつけることになっています。従って、同じ名前のDOMオブジェクトをすべて取り出し、それらをすべて「選択されているかどうか]チェックしていけば、選択されているラジオボタンを知ることができます。
下のリスト部分(1つ目のもの)が、その例です。ここでは、"radios"という名前のDOMオブジェクトをすべてまとめて取り出しています。以下の部分ですね。
こうしてラジオボタンすべてのオブジェクトが得られたら、forの繰り返しを使い、順番にオブジェクトを取り出しては「checkd」プロパティがtrueかどうかを調べます。このcheckedは、選択されているかどうかを示すプロパティで、選択されていればtrueになります。ifでこれをチェックし、trueならばそのオブジェクトのvalueを取得してメッセージを表示しているわけです。
このgetElementsByNameによるやり方は、考え方としては正しいのですが、正直、「たかがラジオボタンをチェックするのに、こんな面倒くさいことをやるのか」と思ってしまったかも知れません。
実は、もっと簡単なやり方があります。「ラジオボタンがONになっている」というのは、つまり「最後にそれがクリックされた」ということでもあります。つまり、onclickでクリックしたイベント処理をするとき、「クリックしたオブジェクト」を関数に渡すことができれば、もっともっとシンプルに処理できるわけです。
そこで考えたのが、下のリスト(2つ目のもの)です。ここでは、それぞれのラジオボタンのonclick属性を以下のように設定してあります。
ここでは、繰り返し処理を行うのに「for(var i = 0;i < radios.length;i++)」というようにしてforを使っています。が、中には「for(radio in radios)のほうがスマートじゃ?」と思った人もいるかも知れません。
結論から言えば、これは使えません。このfor(○ in ○)では、用意されているコントロール以外の値まで混じってしまうのです。
実を言えば、getElementsByNameで取り出されるのは配列ではなく、「HTMLCollection」というオブジェクトなのです。このため、配列のように保管している要素だけでなく、それ以外のプロパティなどもその中に含まれています。for inを使うと、そうしたものまですべて取り出してしまうのです。実際、やってみると保管している項目の他にも「length」プロパティの値などまで取り出されてしまうのです。
というわけで、「getElementsByNameで取り出したものは、for inを使わない」のが基本と考えてください。
チェックボックスである<input type="checkbox">は、「checked」というプロパティでチェックされた状態を知ることができます。ところが、注意しないといけないのは、似ているようで違う「ラジオボタン」です。これもやはりON/OFFするコントロールですが、「複数の中から1つを選ぶ」という働きをするものですから、実はON/OFFではなく「選択」のコントロールなのです。従って、「いくつかあるラジオボタンの中から、選択されたものを探し出す」というやり方を考える必要があります。
○総当たり方式○
まず、正統的?なやり方からです。ラジオボタンは、同じグループ(クリックして1つを選ぶ仲間たち)のものはすべて同じ名前(name属性)をつけることになっています。従って、同じ名前のDOMオブジェクトをすべて取り出し、それらをすべて「選択されているかどうか]チェックしていけば、選択されているラジオボタンを知ることができます。
下のリスト部分(1つ目のもの)が、その例です。ここでは、"radios"という名前のDOMオブジェクトをすべてまとめて取り出しています。以下の部分ですね。
var radios = document.getElementsByName("radios");「getElementsByName」というのは、引数に指定した名前のコントロールに対応するDOMオブジェクトを配列で返すメソッドです。IDと異なり、name属性は同じ名前のものが複数存在する場合があるため、値は配列となるのです。
こうしてラジオボタンすべてのオブジェクトが得られたら、forの繰り返しを使い、順番にオブジェクトを取り出しては「checkd」プロパティがtrueかどうかを調べます。このcheckedは、選択されているかどうかを示すプロパティで、選択されていればtrueになります。ifでこれをチェックし、trueならばそのオブジェクトのvalueを取得してメッセージを表示しているわけです。
○thisを引数にするやり方○
このgetElementsByNameによるやり方は、考え方としては正しいのですが、正直、「たかがラジオボタンをチェックするのに、こんな面倒くさいことをやるのか」と思ってしまったかも知れません。
実は、もっと簡単なやり方があります。「ラジオボタンがONになっている」というのは、つまり「最後にそれがクリックされた」ということでもあります。つまり、onclickでクリックしたイベント処理をするとき、「クリックしたオブジェクト」を関数に渡すことができれば、もっともっとシンプルに処理できるわけです。
そこで考えたのが、下のリスト(2つ目のもの)です。ここでは、それぞれのラジオボタンのonclick属性を以下のように設定してあります。
onclick="doAction(this);"引数にthisを渡すことで、イベントが発生したオブジェクトをdoActionに渡すことができます。後は、引数で渡されたオブジェクトのvalueを取り出して処理するだけです。実に単純ですね!
※注意!――使えるfor、使えないfor
ここでは、繰り返し処理を行うのに「for(var i = 0;i < radios.length;i++)」というようにしてforを使っています。が、中には「for(radio in radios)のほうがスマートじゃ?」と思った人もいるかも知れません。
結論から言えば、これは使えません。このfor(○ in ○)では、用意されているコントロール以外の値まで混じってしまうのです。
実を言えば、getElementsByNameで取り出されるのは配列ではなく、「HTMLCollection」というオブジェクトなのです。このため、配列のように保管している要素だけでなく、それ以外のプロパティなどもその中に含まれています。for inを使うと、そうしたものまですべて取り出してしまうのです。実際、やってみると保管している項目の他にも「length」プロパティの値などまで取り出されてしまうのです。
というわけで、「getElementsByNameで取り出したものは、for inを使わない」のが基本と考えてください。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※nameで取り出し総当たりで調べるやり方 <html> <head> <script type="text/javascript"> <!-- function doAction(){ var radios = document.getElementsByName("radios"); for(var i = 0;i < radios.length;i++){ var radio = radios[i]; if (radio.checked){ var val =radio.value; var message = document.getElementById("message"); message.innerHTML = "あなたは、" + val + "ですね。"; } } } //--> </script> </head> <body> <H1>TEST.</H1> <div id="message">性別を選択:</div> <form onsubmit="return false;"> <input type="radio" id="r1" name="radios" onclick="doAction();" value="男"> <label for="r1">男です。</label><br> <input type="radio" id="r2" name="radios" onclick="doAction();" value="女"> <label for="r2">女です。</label><br> <input type="radio" id="r3" name="radios" onclick="doAction();" value="両性具有"> <label for="r3">両方です。</label> </form> </body> </html> ※引数を使ったやり方 <html> <head> <script type="text/javascript"> <!-- function doAction(obj){ var val = obj.value; var message = document.getElementById("message"); message.innerHTML = "あなたは、" + val + "ですね。"; } //--> </script> </head> <body> <H1>TEST.</H1> <div id="message">性別を選択:</div> <form onsubmit="return false;"> <input type="radio" id="r1" name="radios" onclick="doAction(this);" value="男"> <label for="r1">男です。</label><br> <input type="radio" id="r2" name="radios" onclick="doAction(this);" value="女"> <label for="r2">女です。</label><br> <input type="radio" id="r3" name="radios" onclick="doAction(this);" value="両性具有"> <label for="r3">両方です。</label> </form> </body> </html>
※関連コンテンツ
「初心者のためのJavaScriptプログラミング入門」に戻る