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

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

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

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

jQuery

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

Q&A

解決済

2回答

1334閲覧

リアルタイムで数が変わる要素の判別方法

castail

総合スコア117

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2017/10/12 01:09

編集2017/10/12 01:22

以下の連続するhogeのグループが30個あります。

lang

1<div class="hoge"> 2<ul> 3<li></li> 4<li></li> 5<li></li> 6</ul> 7</div>

この中のliが選択されるとそのliにactive、hogeにselectedというクラスが付与されます。
※liが選択できるのは1つのみ。同じliが再度クリックされると選択解除扱いでクラスも解除。別のliが選択されるとliのクラスは新しい方に付与されるが、selectedはそのまま

lang

1<div class="hoge selected"> 2<ul> 3<li class="active"></li> 4<li></li> 5<li></li> 6</ul> 7</div>

jqueryでこの動的に切り替わるクラス数を判別し、クラス数に応じて別要素.alert1、.alert2、.alert3、.alert4の表示・非表示切り替えを行いたいです。

具体的には、selectedが
▼0の時
.alert1のみ表示
▼1〜14の時
.alert2のみ表示
▼15〜29の時
.alert3のみ表示
▼30の時
.alert4のみ表示
としたいです。

以下の通り、読み込み時の数判別の記述は試したのですが、
リアルタイムで数が変わる処理が分かりません。

lang

1$(function(){ 2 var num = $('.selected').length; 3 if(num==0){ 4 $('.alert1').css('display','block'); 5 $('.alert2,.alert3,.alert4').css('display','none'); 6 } else if (14 >= num >= 1) { 7 $('.alert2').css('display','block'); 8 $('.alert1,.alert3,.alert4').css('display','none'); 9 } else if (29 >= num >= 15) { 10 $('.alert3').css('display','block'); 11 $('.alert1,.alert2,.alert4').css('display','none'); 12 } else { 13 $('.alert4').css('display','block'); 14 $('.alert1,.alert2,.alert3').css('display','none'); 15 } 16});

ご教授のほどよろしくお願いいたします。

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

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

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

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

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

kei344

2017/10/12 01:19

selected/activeが切り替えるのはどのスクリプトでしょうか。具体的なライブラリ名(およびURL)を提示されてはいかがでしょうか。
castail

2017/10/12 01:20

ライブラリはjqueryです。恐れ入りますが、URLは公開前のものなので提示不可です。
kei344

2017/10/12 01:23

そういう意味ではなく、「selected/activeが切り替える」動作のコードがあれば、その動作を起点に動かすことが無理なくできるからなのですが・・・。
guest

回答2

0

ベストアンサー

細かいところはちょっと省略します

css

1.selected{color:red} 2.hide{display:none;}

javascript

1$(function(){ 2 var list={ 3 'alert1':{'min':0,'max':3}, 4 'alert2':{'min':4,'max':6}, 5 'alert3':{'min':7,'max':10}, 6 }; 7 $('.alert2,.alert3').addClass('hide'); 8 $('.hoge').on('click',function(){ 9 $(this).toggleClass('selected'); 10 $.each(list,function(x,y){ 11 var l=$('.hoge.selected').length; 12 $('.'+x).toggleClass('hide',y.min>l || l>y.max); 13 }); 14 }); 15}); 16

HTML

1<div class="hoge">x</div> 2<div class="hoge">x</div> 3<div class="hoge">x</div> 4<div class="hoge">x</div> 5<div class="hoge">x</div> 6<div class="hoge">x</div> 7<div class="hoge">x</div> 8<div class="hoge">x</div> 9<div class="hoge">x</div> 10<div class="hoge">x</div> 11<div class="hoge">x</div> 12<div class="alert1">alert1</div> 13<div class="alert2">alert2</div> 14<div class="alert3">alert3</div>

投稿2017/10/12 02:11

yambejp

総合スコア114829

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

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

castail

2017/10/12 02:44

ご教授いた内容で実現できました! 感謝いたします。ありがとうございました。
guest

0

故あって「selectedやactiveを操作しているコードを直接編集することができない」という場合のため、別の方法も提言してみます。私自身この方法に興味があったのでテストがてら実装してみました。

#MutationObserver
平たく言うと「監視対象のHTMLが書き換わったときに、登録された処理を呼んでくれるやつ」です。例えば今回の場合div.hogediv.hoge ul liのクラスが書き換わるタイミングで改めてカウントしてalertの表示を変えることができればいいんですよね?

実装サンプル
https://jsfiddle.net/anpm23wt/4/

HTML

1<div class="alert1">alert1</div> 2<div class="alert2">alert2</div> 3<div class="alert3">alert3</div> 4<div class="alert4">alert4</div> 5 6<div id="group"> 7 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 8 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 9 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 10 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 11 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 12 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 13 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 14 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 15 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 16 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 17 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 18 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 19 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 20 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 21 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 22 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 23 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 24 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 25 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 26 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 27 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 28 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 29 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 30 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 31 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 32 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 33 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 34 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 35 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 36 <div class="hoge"><ul><li></li><li></li><li></li></ul></div><hr> 37</div>

JavaScript

1// 数を数えてalertを切り替える処理 2function updateAlert() { 3 var count = $('.hoge.selected').length; 4 // 一旦全部hideでdisplay:noneにする 5 $('div.alert1, div.alert2, div.alert3, div.alert4').hide(); 6 // 数にあわせて特定のalertだけshowで戻す 7 if(count == 0) { 8 $('div.alert1').show(); 9 } 10 else if(count <= 14) { 11 $('div.alert2').show(); 12 } 13 else if(count <= 29) { 14 $('div.alert3').show(); 15 } 16 else { 17 $('div.alert4').show(); 18 } 19} 20// ノードの変更を監視し、変更があったときに処理を呼び出すためのObserver(監視者) 21const observer = new MutationObserver((mutations, observer) => { 22 // 変更があったとき、updateAlertを呼び出す 23 updateAlert(); 24}); 25// Observerにdiv.hogeやdiv.hoge ul liを含んだ#groupのノードを監視させる 26// (属性の変更、子ノードの追加削除、文字列の変更、子への再帰的な監視をオンにする) 27observer.observe(document.getElementById('group'), {attributes: true, childList: true, characterData: true, subtree: true}); 28 29// とりあえず一回呼んどいて初期化 30updateAlert(); 31 32// ここから下はクリックでactiveやselectedを切り替える処理 33$('.hoge li').on('click', (e) => { 34 var li = e.target; 35 if($(li).hasClass('active')) { 36 $(li).removeClass('active'); 37 $(li).closest('.hoge').removeClass('selected'); 38 } 39 else { 40 $('li', $(li).closest('ul')).removeClass('active'); 41 $(li).addClass('active'); 42 $(li).closest('.hoge').addClass('selected'); 43 } 44}); 45

投稿2017/10/12 02:47

masaya_ohashi

総合スコア9206

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問