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プログラミング入門」に戻る