jQuery 複数チェックボックスの全選択、全部じゃなくなったらチェック外すやつ
全て
というチェックボックスにチェックを入れると、他のチェックボックスにチェックを入れるというやつ、ググると沢山出てきますが、皆なんか仕様がおかしくない!?
と私は思う訳です。(会社の人に言われて気付いただけ)
どういうことか
↓「全て」にチェックを入れる
全てのチェックボックスにチェックが入る
ここまでは良いですよね。
↓「とんこつ」と「塩」のチェックを外す
WHY JAPANESE PEOPLE!!
全てのチェックボックスにチェックが入っていないのに、「全て」にチェックが入っているのはおかしいダロウ!!
と思うのです。
↑この動きが正しいのではないかと思います。
デモあります。
という事で、実装してみます。
環境
jquery-1.11.3
ソース
html
<input type="checkbox" id="category_all" name="category_all"> <label for="category_all">全て</label> <div id="categories"> <input type="checkbox" name="category_01" id="category_01" value="01" class="category"> <label for="category_01">とんこつ</label> <input type="checkbox" name="category_02" id="category_02" value="02" class="category"> <label for="category_02">味噌</label> <input type="checkbox" name="category_03" id="category_03" value="03" class="category"> <label for="category_03">醤油</label> <input type="checkbox" name="category_04" id="category_04" value="04" class="category"> <label for="category_04">塩</label> <input type="checkbox" name="category_05" id="category_05" value="05" class="category"> <label for="category_05">その他</label> </div>
$(function() { $('#category_all').on('click', function() { $('.category').prop('checked', this.checked); }); $('.category').on('click', function() { if ($('#categories :checked').length == $('#categories :input').length){ $('#category_all').prop('checked', 'checked'); }else{ $('#category_all').prop('checked', false); } }); });
ポイント
その1 ~全選択・全解除~
- 「全て」以外のチェックボックスに
class="category"
を付与。 - 「全て」がクリックされたら「全て」の
checked
の値をclass="category"
のチェックボックスのchecked
に付与。 checked
に値を付与する時は、attrではなく、propを使う。
参考記事:よくある全選択チェックボックス jQuery 実装 - Qiita
- 「全て」以外のチェックボックスに
その2 ~全てのチェックボックスにチェックが入ったら「全て」にチェックを入れる~
- 「全て」以外のチェックボックスを
<div id="categories">
で囲む。 <div id="categories">
内の、チェックボックスの個数と、チェックが入ったチェックボックスの個数を比較する。
参考記事:複数のチェックボックスをjQueryで数える - まるでちょんまげハリウッド- 2.の比較結果が等しければ「全て」にチェックを入れる。そうでなければ、「全て」のチェックを外す。
- 「全て」以外のチェックボックスを
最後に
全選択・全解除をボタンで実装しているなら問題ないと思いますが、そうでない場合は困りますよね!人によってはバグなんじゃない?ってなりそうです。
気付かない人もいると思いますが、利用場面によっては気付く人が多くなったり、混乱させてしまったりすると思います。
やり方を知っておくだけでもとても勉強になりました。
厚切りジェイソンさんのネタ、勝手に借りました。ごめんなさい、ありがとう!