質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

4回答

1778閲覧

HTMLで全て選択のチェックボックスの実装をしたい

Qawsedrgtg

総合スコア11

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/06/19 13:57

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
HTMLでチェックボックスと、全て選択というチェックボックスを実装したい

JQueryはわからないため、JavaScriptを使用

発生している問題・エラーメッセージ

チェックボックスが全て選択とTEST1だけの場合、 どちらにもチェックされていない状態で、全て選択をチェックしてもTEST1にチェックが入らず、 どちらもチェックしている状態でTEST1のチェックボックスを外しても全て選択からチェックが外れない 複数ある場合は問題なくチェックが入る

該当のソースコード

html

1<form name="form"> 2 <label> 3 <input type="checkbox" name="all" onClick="AllChecked();" />全て選択 4 </label> 5 <p> 6 <label> 7 <input type="checkbox" name="test" value="TEST1" onClick="DisChecked();" />TEST1 8 </label> 9 10<!-- 11 <label> 12 <input type="checkbox" name="test" value="TEST2" onClick="DisChecked();" />TEST2 13 </label> 14 <label> 15 <input type="checkbox" name="test" value="TEST3" onClick="DisChecked();" />TEST3 16 </label> 17 <label> 18 <input type="checkbox" name="test" value="TEST4" onClick="DisChecked();" />TEST4 19 </label> 20--> 21 22 </p> 23</form> 24 25<script language="JavaScript" type="text/javascript"> 26<!-- 27 // 「全て選択」チェックで全てにチェック付く 28 function AllChecked(){ 29 var all = document.form.all.checked; 30 for (var i=0; i<document.form.test.length; i++){ 31 document.form.test[i].checked = all; 32 } 33 } 34 35 // 一つでもチェックを外すと「全て選択」のチェック外れる 36 function DisChecked(){ 37 var checks = document.form.test; 38 var checksCount = 0; 39 for (var i=0; i<checks.length; i++){ 40 if(checks[i].checked == false){ 41 document.form.all.checked = false; 42 }else{ 43 checksCount += 1; 44 if(checksCount == checks.length){ 45 document.form.all.checked = true; 46 } 47 } 48 } 49 } 50// --> 51</script>

試したこと

下記Webページ参照

http://labyrinth-of-wisdom.hatenadiary.com/entry/2016/07/20/202324

補足情報(FW/ツールのバージョンなど)

HTML5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

こんにちは

ご質問にあるコードに最低限の修正をして、意図通りに動作させるには、以下のように修正すればよいかと思います。

diff

1function AllChecked(){ 2 var all = document.form.all.checked; 3+ var checks = document.querySelectorAll("input[name=test]"); 4- for (var i=0; i<document.form.test.length; i++) { 5- document.form.test[i].checked = all; 6+ for (var i=0; i<checks.length; i++){ 7+ checks[i].checked = all; 8 } 9}

diff

1function DisChecked(){ 2- var checks = document.form.test; 3+ var checks = document.querySelectorAll("input[name=test]");

(※ご質問にあるコードでは、DisCheckedの直前が全角スペースになっているようです。)

上記のように修正する理由としては、name="test" のチェックボックスが複数あるとき、

javascript

1document.form.test

は、配列に似た RadioNodeListオブジェクトであるので、ご質問のコードにあるようなforループで各要素を取得できますが、name="test" のチェックボックスが1個のときは、要素が1個のRadioNodeListではなく、そのチェックボックス要素自体であるために、後のforループが意図した動作にならないからです。ですので、1個の場合も複数の場合も、ご質問にあるfor文で意図通りの動作をさせるためには、上記のDiffで示したとおり、該当要素が1個の場合も、配列に似たオブジェクトを返してくれる、querySelectorAll を使うように修正すれば問題は解決すると思います。

以上、参考になれば幸いです。

追記

リファクタリング案を挙げておきます。

javascript

1var testChecks = [...document.querySelectorAll("input[name=test]")]; 2 3function AllChecked() { 4 var { checked } = document.form.all; 5 testChecks.forEach(test => { 6 test.checked = checked; 7 }); 8} 9 10function DisChecked() { 11 document.form.all.checked = testChecks.every(test => test.checked); 12}

投稿2020/06/19 15:03

編集2020/06/19 15:54
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thyda.eiqau

2020/06/19 15:24 編集

回答の論旨に対するコメントではありませんが、function DisChecked(){の全角スペースも要修正と思います。 →と思ったら追記のところで修正されてました。diffのところだけ見ていました。失礼しました。
jun68ykt

2020/06/19 15:31

@thyda.eiqauさん コメントありがとうございます。念のため、2つ目のDiffの後に注記しておきました。
guest

0

こんな感じで

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 const all=document.querySelector('#all'); 4 const tests=document.querySelectorAll('.test'); 5 all.addEventListener('change',e=>{ 6 if(e.target.checked){ 7 tests.forEach(x=>{ 8 x.checked=true; 9 }); 10 } 11 }); 12 tests.forEach(x=>{ 13 x.addEventListener('change',e=>{ 14 if(!e.target.checked){ 15 all.checked=false; 16 } 17 }); 18 }); 19}); 20</script> 21<form name="form"> 22<label><input type="checkbox" name="all" id="all">全て選択</label> 23<p> 24<label><input type="checkbox" class="test" name="test" value="TEST1">TEST1</label> 25<label><input type="checkbox" class="test" name="test" value="TEST2">TEST2</label> 26<label><input type="checkbox" class="test" name="test" value="TEST3">TEST3</label> 27<label><input type="checkbox" class="test" name="test" value="TEST4">TEST4</label> 28</p> 29</form> 30

投稿2020/06/20 06:39

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「document.form.test」がダメなのはもう書いてあるからいいとして

「どれか外した時に[すべて選択]のチェック外す」
書いてないけど「全部つけた時に[すべて選択]のチェックつける」
こんなことやるくらいならボタンでよくない?元も子もない話だけど。

[すべて選択]のボタン押したら、全部つけて終わり!じゃダメなの?

投稿2020/06/20 06:31

sousuke

総合スコア3830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

別な解法です。
個人的にはHTML文書の中に onclick="~~~~" を書き込むのは好きではありません。
というか「書き込むべきではない派」です。
そして使いまわしの利かない関数(それ専用)を書くのは、
「いい加減卒業しろよ派」です。
同じような関係を複数指定する場合に便利ですよ。

html

1<body> 2 <form name="form"> 3 <p><label><input type="checkbox" name="all">全て選択</label> 4 <p> 5 <label><input type="checkbox" name="test" value="TEST1">TEST1</label> 6 <label><input type="checkbox" name="test" value="TEST2">TEST2</label> 7 <label><input type="checkbox" name="test" value="TEST3">TEST3</label> 8 <label><input type="checkbox" name="test" value="TEST4">TEST4</label> 9 10 <p><label><input type="checkbox" name="all1">全て選択</label> 11 <p> 12 <label><input type="checkbox" name="test1" value="TEST1">TEST1</label> 13 <label><input type="checkbox" name="test1" value="TEST2">TEST2</label> 14 15 </form> 16 17<script> 18class A { 19 constructor (parent, child) { 20 this.parent = parent; 21 this.child = [...child]; 22 23 parent.form.addEventListener ('click', this, false); 24 } 25 26 handleEvent ({target: e}) { 27 if (e === this.parent) 28 this.child.forEach (o=> o.checked = e.checked); 29 else if (this.child.includes (e)) 30 this.parent.checked = this.child.every (o=> o.checked); 31 } 32 33 static create (pname, cname) { 34 let 35 parent = document.querySelector (`input[name="${pname}"]`), 36 child = document.querySelectorAll (`input[name="${cname}"]`); 37 38 if (! parent || ! child) 39 throw new Error; 40 41 return new A (parent, child); 42 } 43} 44 45A.create ('all', 'test'); 46A.create ('all1', 'test1'); 47</script>

投稿2020/06/19 17:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問