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

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

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

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

jQuery

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

Q&A

解決済

2回答

2772閲覧

jQueryの「.parents」や「.parent」で上手な方法を教えてほしいです。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/04/06 06:39

編集2018/04/06 06:54

###目的
自動でチェックする機能をかなり頑張って作ったのですが、親要素の取得で躓いています。上手な取得方法を知りたいです。

###現状と問題
子チェックしたときに、「.parents」(←sがついてる)を使っているせいで、自分の親だけでなく別の親のチェックボックスも拾ってチェックを入れてしまうのです。

下記コードで言うと、「親apple」の「子1・2」にチェックを入れると、.paretnsのせいで「別の親grape」にまでチェックが入ってしまいます。

どなたか、上手な方法をご教示頂けませんでしょうか?

▼動くサンプル
https://jsfiddle.net/79cqw3fh/

▼そのコード

html

1<ul class="c-checklist"> 2 <li><input id="c-apple" type="checkbox" name="chk_fluits2"> 3 <label for="c-apple" class="check_label_c"> 4 <p>apple</p> 5 <ul> 6 <li><input id="c-apple-1" class="check-c check-1" type="checkbox" name="chk_fluits" value="c-apple-1" target="c-apple-1"><label for="c-apple-1" class="check_label_1">1</label></li> 7 <li><input id="c-apple-2" class="check-c check-2" type="checkbox" name="chk_fluits" value="c-apple-2" target="c-apple-2"><label for="c-apple-2" class="check_label_2">2</label></li> 8 </ul> 9 </label> 10 </li> 11 <li><input id="c-grape" type="checkbox" name="chk_fluits2"> 12 <label for="c-grape" class="check_label_c"> 13 <p>grape</p> 14 <ul> 15 <li><input id="c-grape-1" class="check-c check-1" type="checkbox" name="chk_fluits" value="c-grape-1" target="c-grape-1"><label for="c-grape-1" class="check_label_1">1</label></li> 16 <li><input id="c-grape-2" class="check-c check-2" type="checkbox" name="chk_fluits" value="c-grape-2" target="c-grape-2"><label for="c-grape-2" class="check_label_2">2</label></li> 17 </ul> 18 </label> 19 </li> 20</ul>

javascript

1////親チェックしたとき 2//子を2つともチェックする。または子が2つチェックされていたら外す。 3(function($){ 4$('input[name="chk_fluits2"]').change(function(){ 5 6 var childfluits = $(this).parent().find('input[name="chk_fluits"]'); 7 var checkcount = $('.check-c:checked').length; 8 9 if (checkcount == 2 ){ 10 $(childfluits).prop('checked', false); 11 $(this).prop('checked', false); 12 } else { 13 14 if ($(this).prop("checked") == true) { 15 $(childfluits).prop('checked', true); 16 } else { 17 $(childfluits).prop('checked', false); 18 } 19 } 20 21}); 22})(jQuery); 23 24 25////子チェックしたとき 26//2つともチェックが入ったら、親チェックも入れる 27(function($){ 28$('input[name="chk_fluits"]').change(function(){ 29 30 var parentfluits = $(this).parents().find('input[name="chk_fluits2"]'); 31 var checkcount = $('.check-c:checked').length; 32 33 if (checkcount == 2 ){ 34 $(parentfluits).prop('checked', true); 35 } 36 37}); 38})(jQuery); 39 40 41////子チェックしたとき 42//2つともチェックが外されたら、親チェックも外す 43(function($){ 44$('input[name="chk_fluits"]').change(function(){ 45 46 var parentfluits = $(this).parents().find('input[name="chk_fluits2"]'); 47 var checkcount = $('.check-c:checked').length; 48 49 if (checkcount == 0 ){ 50 $(parentfluits).prop('checked', false); 51 } 52 53}); 54})(jQuery);

あとできれば、上の冗長であろうjQueryを、もっとスマートにもしたいのですが、どのような考え方をすればいいかお導き頂けると嬉しいです。

よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2018/04/06 06:46

jqurty・・・。 jQueryとし、タグに追加しておいてください。
x_x

2018/04/06 06:52

label要素の子としてpやulは取れないので、まずはHTMLを修正してもらえないでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/06 06:55

mts10806さん、ご指摘ありがとうございます。2点修正いたしました。
退会済みユーザー

退会済みユーザー

2018/04/06 06:56

x_xさん、ありがとうございます。チェックボックスが大量にあるためHTMLはこのままでいきたいのですが、その場合は今回のようなチェック連動機能はあきらめる他なさそうでしょうか?
x_x

2018/04/06 07:01

p,ulを無視するとしてもlabel要素の子孫にlabelが示していないinputがあり、誤動作する恐れがあります
x_x

2018/04/06 08:17

指摘しても直さないということでしょうか? 壊れたHTMLには回答する気になりません。
退会済みユーザー

退会済みユーザー

2018/04/06 09:18

あ、いえ、とんでもないです。直し方がわからなくって、苦戦しているところでした。そもそもその変なlabelによって、親のチェック範囲を広くする(子のチェックエリアを囲む)。という目的があったのです。で、それが壊れているとなりますと、では、どうやればlabelを消しながらも親のチェック範囲を広くたもつことができるのか。と、そこがわからず、返信に苦慮していた次第です。誤解させてしまってごめんなさい。事後報告で恐縮ですけれど、その後yambejpさんが先述の修正をして頂いたHTMLまで書いたくださったので、解決に至りました。ご検討いただき大変ありがとうございます。
guest

回答2

0

ベストアンサー

labelが変なのではずしました
そもそもchk_fluits2とchk_fluitsには親子関係がないので、
多少工夫が必要でしょう

javascript

1$(function(){ 2 $('input[name="chk_fluits"]').on('change',function(){ 3 var p=$(this).closest('ul').closest('li').find('input[name="chk_fluits2"]'); 4 var c=$(this).closest('ul').find('input[name="chk_fluits"]'); 5 if(c.filter(':checked').length==2) p.prop('checked',true); 6 if(c.filter(':checked').length==0) p.prop('checked',false); 7 }).trigger('change'); 8});

HTML

1<ul class="c-checklist"> 2<li><input id="c-apple" type="checkbox" name="chk_fluits2"> 3<p>apple</p> 4<ul> 5<li><input id="c-apple-1" class="check-c check-1" type="checkbox" name="chk_fluits" value="c-apple-1" target="c-apple-1"><label for="c-apple-1" class="check_label_1">1</label></li> 6<li><input id="c-apple-2" class="check-c check-2" type="checkbox" name="chk_fluits" value="c-apple-2" target="c-apple-2"><label for="c-apple-2" class="check_label_2">2</label></li> 7</ul> 8</li> 9<li><input id="c-grape" type="checkbox" name="chk_fluits2"> 10<p>grape</p> 11<ul> 12<li><input id="c-grape-1" class="check-c check-1" type="checkbox" name="chk_fluits" value="c-grape-1" target="c-grape-1"><label for="c-grape-1" class="check_label_1">1</label></li> 13<li><input id="c-grape-2" class="check-c check-2" type="checkbox" name="chk_fluits" value="c-grape-2" target="c-grape-2"><label for="c-grape-2" class="check_label_2">2</label></li> 14</ul> 15</label> 16</li> 17</ul>

追記

なるほど仕様がいろいろあるのですね

  • ピンクの領域をクリックすると、チェックが一つでもあれば消え、何もなければ全チェック
  • 親をチェックすると子が全チェック、親のチェックを外すと子のチェックが全部はずれる
  • 子のチェックを両方すると親がチェックされ、このチェックを両方はずすと親のチェックが外れる
  • このチェックが片方の場合は親は反応しない

上記の仕様をを入れ込むとこんな感じでしょうか?
いずれにしろ、親に対するラベルは辞めたほうがいいです。

CSS

1.sitsumon { 2 background: aqua; 3} 4.c-checklist li { 5 background: pink; 6 margin: 10px; 7 list-style: none; 8 padding: 5px; 9} 10.c-checklist li ul li label { 11 background: #000; 12 color: #FFF; 13 padding: 1px 10px 1px 10px; 14}

javascript

1$(function(){ 2 $('input[name="chk_fluits"]').on('change',function(){ 3 var p=$(this).closest('ul').closest('li').find('input[name="chk_fluits2"]'); 4 var c=$(this).closest('ul').find('input[name="chk_fluits"]'); 5 if(c.filter(':not(:checked)').length==0) p.prop('checked',true);/*改良*/ 6 if(c.filter(':checked').length==0) p.prop('checked',false); 7 }).trigger('change'); 8 $('input[name="chk_fluits2"]').on('change',function(){ 9 $(this).siblings().find('input[name="chk_fluits"]').prop('checked',$(this).prop('checked')); 10 }).trigger('change'); 11 $('.c-checklist input[type=checkbox],.check_label').on('click',function(e){ 12 e.stopPropagation(); 13 }); 14 $('.c-checklist>li').on('click',function(e){ 15 $(this).find('[type=checkbox]').prop('checked',$(this).find('[type=checkbox]:checked').length==0?true:false); 16 }); 17});

HTML

1<ul class="c-checklist"> 2<li><input id="c-apple" type="checkbox" name="chk_fluits2"> 3<p>apple</p> 4<ul> 5<li><input id="c-apple-1" class="check-c check-1" type="checkbox" name="chk_fluits" value="c-apple-1" target="c-apple-1"><label for="c-apple-1" class="check_label">1</label></li> 6<li><input id="c-apple-2" class="check-c check-2" type="checkbox" name="chk_fluits" value="c-apple-2" target="c-apple-2"><label for="c-apple-2" class="check_label">2</label></li> 7</ul> 8</li> 9<li><input id="c-grape" type="checkbox" name="chk_fluits2"> 10<p>grape</p> 11<ul> 12<li><input id="c-grape-1" class="check-c check-1" type="checkbox" name="chk_fluits" value="c-grape-1" target="c-grape-1"><label for="c-grape-1" class="check_label">1</label></li> 13<li><input id="c-grape-2" class="check-c check-2" type="checkbox" name="chk_fluits" value="c-grape-2" target="c-grape-2"><label for="c-grape-2" class="check_label">2</label></li> 14</ul> 15</label> 16</li> 17</ul>

投稿2018/04/06 07:20

編集2018/04/06 08:11
yambejp

総合スコア114837

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

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

退会済みユーザー

退会済みユーザー

2018/04/06 07:32 編集

yambejpさん、いつもありがとうございますっ! >labelが変なのではずしました 実はlabelは「親の中に子を置きたい」ために書きました。 ■質問のJSfiddle(https://jsfiddle.net/79cqw3fh/) →親のピンク部分をクリックすると、中の子にチェックが入ります。ところが、 ■ご回答のJSfiddle(https://jsfiddle.net/79cqw3fh/3/) →親のピンク部分をクリックしても、中の子にチェックが入らず、親のチェックボックスをクリックしなければなりません。 と、このように、labelがはずされてしまうと、ちょっとだけ機能が理想と変わってしまい、少し、、残念ではあります。(>_<) でも、ifからlength==2のあたりの書き方、とても勉強になりました。どうもありがとうございます。
yambejp

2018/04/06 07:35

labelがfor-idでつながっているので、子の状態を無視して 常に反応してしまうので、この場合labelを設定するという選択肢は 混乱を招くだけでしょう
退会済みユーザー

退会済みユーザー

2018/04/06 07:35

って、すみません! HTMLは質問のままで、jqueyだけ戴けば、理想の機能になるのですね。よく確認せずになんだか文句のようなことを言ってしまい、大変失礼いたしました! ところで、上述したように「ピンクをクリックして子を反応させたい」という理想の機能があるのならば、labelは変ではありませんよね?
退会済みユーザー

退会済みユーザー

2018/04/06 07:38 編集

16:35に頂戴したご返信、ただいま拝見いたしました。 なるほど。やはり変なのですか。悩みます。。 ご指摘ありがとうございます。
yambejp

2018/04/06 08:03

仕様をいろいろ入れ込んで追記しました
退会済みユーザー

退会済みユーザー

2018/04/06 09:21 編集

高評価が一度しか押せないのがくやしいです。笑 HTMLの直し方がわからずちょうど悩んでいるところだった上、なんと!直ったHTMLに適切なJqueryまで書いて頂いているとは、思ってもいませんでした。 今回もとても助かりました。まことにありがとうございます!!
退会済みユーザー

退会済みユーザー

2018/04/06 09:49

失礼いたします。少し脇道なのですけれど、 (function($){ $('input[name="chk_fluits2"]').on('change',function(){ console.log("hello"); }); })(jQuery); と書いても、「読み込みんだとき」にhelloが出力されてしまうのは、なぜでしょうか? これは「chk_fluits2の値が変化したとき」に出力されるハズではないのでしょうか?? 実は値が変化したときにやりたい操作を追加で思いついたのですが、なかなかできずに悩み中でして。(>_<) あと、 on('change',function(){ は .change(function() { と全く一緒でしょうか? お手すきの折にご返信いただければと思いますです。
yambejp

2018/04/06 10:03

$('input[name="chk_fluits2"]').on('change',function(){ $(this).siblings().find('input[name="chk_fluits"]').prop('checked',$(this).prop('checked')); }).trigger('change'); と、ロード時にchangeイベントを呼んでるからですね、 チェックボックス同士が相関関係をもっているため そのリンクを確保するためにload時に 一度プログラム的にchangeイベントを走らせていています。
yambejp

2018/04/06 10:06

それと ・on('change',function(){ ・.change(function() { は、一緒ですが、onはイベントが変わっても切り口が一つなので便利ですし 複数のイベントを設定したりできるので私はon派でです
退会済みユーザー

退会済みユーザー

2018/04/06 10:35

.trigger でchangeをそのようにしているのですか!私が console.log を書いたのは、 ご提示戴いたこちら $(function(){ … }); の外に書いたのですが、それでも .toggle はずっと引きずって有効なのですね。うーん、難しいです。 使い方が高レベルすぎて仰ることが3割しかわかりませんが笑、.trigger や .siblings など全く知らないものに触れるキッカケになりました。ありがとうございます。 on('change',function(){ についてもありがとうございます。
guest

0

投稿2018/04/06 06:45

defghi1977

総合スコア4756

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

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

退会済みユーザー

退会済みユーザー

2018/04/06 06:56

defghi1977さん、こんにちは。ありがとうございます。拝見してまいります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問