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

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

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

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

3506閲覧

孫から親をさかのぼって、チェックボックスをすべて入れたい

yuujiMotoki

総合スコア90

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/04/10 00:07

編集2021/04/12 00:01

階層リストのチェックボックスを作っています

子供を押すと、親が押されるようにしたいのですが・・・

21/04/12
仕様を追記

・親に属している子(孫)のなかで、一つでもチェックボックスがあれば、その親全部にさかのぼってチェックが入る
・チェックボックスの状態は、子孫には繁栄しない

■朝ごはん   ■味噌汁     ■わかめ □昼ごはん   □ラーメン     □わかめ   □夜ごはん   □スープ     □わかめ

#質問事項
JqueryのParentをさかのぼって、チェックボックスを辿るには、どうしたらいいでしょうか?

下記のようにテストしてみると、わかめの親が、いつまでたっても味噌汁のままで変わらないのですが、
(どこかで朝ごはんに、たどり着くと思っていました)

$(this).parent().parent().find('label').html() "わかめ" $(this).parent().parent().parent().find('label').html() "味噌汁" $(this).parent().parent().parent().parent().parent().parent().parent().find('label').html() "味噌汁"

#ソース

21/04/12 書き換えを致しました。

https://jsfiddle.net/motochan/sqwL7xft/

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 5 <title>label with check box test</title> 6 <script src="https://code.jquery.com/jquery-3.6.0.slim.min.js" 7 integrity="sha256-u7e5khyithlIdTpu22PHhENmPcRdFiHRjhAuHcs05RI="crossorigin="anonymous"></script> 8 </head> 9 10 <body> 11 <ul> 12 <li><input type="checkbox"><label>献立</label> 13 <ul> 14 <li><input type="checkbox"><label>朝ごはん</label> 15 <ul> 16 <li><input type="checkbox"><label>味噌汁</label> 17 <ul> 18 <li><input type="checkbox"><label>わかめ</label></li> 19 </ul> 20 </li> 21 </ul> 22 </li> 23 <li><input type="checkbox"><label>昼ごはん</label> 24 <ul> 25 <li><input type="checkbox"><label>ラーメン</label> 26 <ul> 27 <li><input type="checkbox"><label>わかめ</label></li> 28 </ul> 29 </li> 30 </ul> 31 </li> 32 <li><input type="checkbox"><label>夜ごはん</label> 33 <ul> 34 <li><input type="checkbox"><label>スープ</label> 35 <ul> 36 <li><input type="checkbox"><label>わかめ</label></li> 37 </ul> 38 </li> 39 </ul> 40 </li> 41 </ul> 42 </li> 43 </ul> 44 </body> 45</html> 46

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

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

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

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

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

ku__ra__ge

2021/04/10 05:52

現象が確認できません。それだけで現象を再現できるコードを貼ってください。
guest

回答2

0

自己解決

hatena19さんのコードを若干変更して、所望の実装ができました。

prevというのは、DOMの真横の要素なんですね。
今回は親<UL>→直前の<LABEL>→直前の<INPUT>と後ろからさかのぼりました。

リンク内容

$("li input").on('click', function() { if ($(this).prop('checked')== true){ $(this).parents('ul').each(function(index) { $(this).prev().prev().prop('checked', true); }); } });

投稿2021/04/12 04:21

yuujiMotoki

総合スコア90

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

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

0

まず、回答の前に、HTML構造が文法違反です。

html

1 <ul> 2 <li><input type="checkbox"><label>献立</label></li> 3 <ul> /* ←ここが文法違反 */ 4 5 /* 略 */ 6 7 </ul> 8 </ul>
<ul>内に<ul>は置けません。(下記参照)

<ul>: 順序なしリスト要素 - HTML: HyperText Markup Language | MDN

許可されている内容 0個以上の <li>, <script>, <template> 要素。

下記のように <li> の中に入れるようにしてください。(下の階層も同様に)

html

1 <ul> 2 <li> 3 <input type="checkbox"><label>献立</label></li> 4 <ul> 5 6 /* 略 */ 7 8 </ul> 9 </li> 10 </ul>

HTMLを上記をもとにまずは修正しましょう。


あと、仕様が曖昧です。下記のような仕様だと勝手に解釈しました。

階層構造のチェックボックスにおいて、
親と子のチェック状況が常に対応しているようにする。

例えば、
子要素をチェックすることによって、グループ内のチェックボックスがすべてチェック状態なら、親にもチェックをいれる。子要素のチェックを外すと親要素のチェックも外れる。

親要素にチェックを入れると、その子要素にチェックが入る。
親要素にチェックを外すと、その子要素のチェックが外れる。

上記の動作は子孫要素、祖先要素にも反映される。

js

1$("li input").on('click', function() { 2 //子孫に反映 3 $(this).closest('li').find("input").prop('checked', $(this).prop('checked')); 4 //祖先に反映 5 $(this).parents('ul').each(function(index) { 6 let cul = $(this); 7 let nck = cul.find('input:not(:checked)'); 8 cul.prev().children().prop('checked', nck.length == 0); 9 }); 10});

CodePenサンプル


追記された仕様に対応するコードです。

js

1$("li input").on('click', function() { 2 if ($(this).prop('checked')== true){ 3 $(this).parents('ul').each(function(index) { 4 $(this).prev().children().prop('checked', true); 5 }); 6 }; 7});

※修正しました。4/12 12:05

投稿2021/04/10 06:31

編集2021/04/12 03:05
hatena19

総合スコア34075

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

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

yuujiMotoki

2021/04/12 00:07 編集

codeを見させていただきました。 仕様を追加しましたが、要素をON選択したときに、親全部のチェックボックスがONになる仕様です。 子供をOFFにしても、親には伝搬せず、親のOFFは手動になります。 子孫には何も伝搬はしません。
hatena19

2021/04/12 00:29

私のサンプルを少し改造すれば可能だと思いますよ。(よりシンプルなコードになります。) ただ、その仕様は個人的には違和感があります。 子が選択されていないのに、親だけ選択されている状態は、矛盾しているように思います。
yuujiMotoki

2021/04/12 02:51 編集

ありがとうございましす。今後の参考に教えていただきたいと思うのですが、 今回のコードに合わせて、自分で事前に検討していた下記のコードを、ご添削いただけませんでしょうか。何か私が、根本的なことを間違えているか、知らない知識がありますでしょうか? ```html $(':checkbox').change(function(){ $(this).forEach(function (){ if ($(this).prop('checked')== true){ $(this).parent().children('input:first').prop('checked',true); } }) }); ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問