0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

getElementsByNameで取得したラジオボタンでイベントが発生しない

Posted at

#ラジオボタンが複数ある時、onchangeが発生しない場合の対処法

先日、JavaScriptを使って、ラジオボタンにonchangeイベントを設定しようとしたのですが、上手く実装できませんでした。ラジオボタンが一つだけであれば、idを取得すればよいのですが、今回は複数あったのでidだとコードが冗長になってしまう...。ここでメモ程度に記録しておきます。

今回用意するHTMLは以下の通りです。

/*ラジオボタン群*/
<input type="radio" name="r" id="r_1" value="1" checked="checked" /><label for="r_1">ラジオ1</label>
<input type="radio" name="r" id="r_2" value="2" /><label for="r_2">ラジオ2</label>
<input type="radio" name="r" id="r_3" value="3" /><label for="r_3">ラジオ3</label>
<input type="radio" name="r" id="r_4" value="4" /><label for="r_4">ラジオ4</label>

JavaScriptはこちら


//ラジオボタン群を取得
var r = document.getElementsByName('r');

r.onchange = function() {
	//これだとonchangeは発生しない
}

こんな感じで、別のラジオボタンをクリックしたらonchangeが発生して...といった具合に
処理を書いていたのですが、いざ実行すると何も動かない。デバックしてみるとonchangeがそもそも発生していない。

選択リストであれば、nameを取得して、これでできるはずなのになぜだ...。

原因はラジオボタンをnameで取得した場合は、ラジオボタンの各情報が配列で格納されていたからでした。
なので、配列を一つ一つ取り出してから、それぞれにonchangeを設定していく必要があったみたいです。

修正したのがこちら。

//ラジオボタン群を取得
var r = document.getElementsByName('r');

for (var i = 0; i < r.length; i++) {
		r[i].onchange = function() { //配列を取り出し一つ一つにonchangeを設定
			for (var j = 0; j < r.length; j++) {
				if (r[j].checked == true) {
					//j+1番目のラジオボタンがチェック状態になった時の処理
			}
		}
	}
}

といった感じで無事問題は解決しました。

ちなみにjQueryを使えばこんなことをしなくても...


$('input[name="r"]').change(function() { //←これだけでいい。
        /*ちなみにチェックされたラジオボタンの情報はthisに入っている。
        下記はチェックされたラジオボタンのvalue値を取得できる。*/
		$(this).val();
});

上記のような具合で、配列なんか使わなくても、たった1行でonchangeが設定できてしまいます。

##まとめ
選択リストは、選択リストで一つのもので、ラジオボタンはそれぞれ独立しているイメージ。
だから選択リストはnameを取得してもonchangeを設定できるけど、ラジオボタンでnameを設定してもonchangeは効かない。独立しているから、それぞれに設定する必要がある。
(言葉にするのが難しい...)

以上。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?