🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

jQuery

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

HTML

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

Q&A

解決済

3回答

593閲覧

jQueryで「全体を非表示」→「指定箇所を表示」を順に処理したい

kannmuri

総合スコア42

JavaScript

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

jQuery

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

HTML

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

0グッド

0クリップ

投稿2019/10/18 05:14

編集2019/10/18 05:32

###実現したいこと
下記HTMLについて、➀~➅の順で処理したいです。

<button>クリック
.outerfadeOut()
<p>cat</p><p>dog</p>を『1つ』ずつ挿入
<button>のデータ属性に応じた箇所をfadeIn()
<p>ape</p>を『1つ』挿入

ざっくりいいますと
<p>cat</p><p>dog</p>は非表示中に見えないように挿入したい!!
<p>ape</p>は表示後に挿入したい!!
ということですが、上に『1つ』を強調してあるように、これが『複数』になってしまう問題が発生しました。

###発生している問題
下記jQueryで<button>をクリックすると、<p>cat</p><p>dog</p>が『6つ』ずつ挿入され、<p>ape</p>は『2つ』挿入されてしまいます。全部『1つ』でいいのに!

###該当のソースコード
下記HTMLとjQueryのサンプルをどうぞ。
https://jsfiddle.net/96bqn8hf/

まずHTMLです。表示切替の流れを作るため、<button>のデータ属性にouterTypeinnertTypeを持たせ、それぞれ表示を切り替えるべき.outer.innerに対応させました。

html

1<div class="wrapeer"> 2 3 <div class="outer" data-outerType="1"> 4 <div class="inner" data-innerType="A">innerA</div> 5 <div class="inner" data-innerType="B">innerB</div> 6 </div> 7 8 <div class="outer" data-outerType="2"> 9 <div class="inner" data-innerType="C">innerC</div> 10 <div class="inner" data-innerType="D">innerD</div> 11 </div> 12 13 <button type="button" data-innerType="A" data-outerType="1">A</button> 14 <button type="button" data-innerType="B" data-outerType="1">B</button> 15 <button type="button" data-innerType="C" data-outerType="2">C</button> 16 <button type="button" data-innerType="D" data-outerType="2">D</button> 17 18</div>

次にjQueryですが、➀~➅の流れのために

fadeOut()の中にcat();dog();を書いた。
fadeIn()の中にape();を書いた。

ということをやってみました。タイミングはいいかんじ。

ですが、こうすると挿入が『複数』になるわけです。

$('button').click(function(){ const outerType = $(this).attr('data-outerType'); const innerType = $(this).attr('data-innerType'); $('.outer, .inner').fadeOut(200, function() { cat(); dog(); }); $('.outer[data-outerType="'+outerType+'"], .inner[data-innerType="'+innerType+'"]').delay(200).fadeIn(200, function() { ape(); }); }); function cat(){ $('.outer').append('<p>cat</p>'); } function dog(){ $('.outer').append('<p>dog</p>'); } function ape(){ $('.outer').append('<p>ape</p>'); }

###試したこと
上だと『複数』の挿入になり、なぜかといろいろ試していましたところ、どうやら.outer.innerの数に応じて挿入されてしまうことがわかりました。

これは困ります。

<p>cat</p><p>dog</p>は非表示中に見えないように挿入したい!!
<p>ape</p>は表示後に挿入したい!!
という目的のために、

fadeOut()の中にcat();dog();を書いた。
fadeIn()の中にape();を書いた。

をしていて、つまりfadeout()後に挿入が実行され、同様にfadeIn()の後に実行されるようにしているわけですが、こいつらせいで対象の.outer.innerの数だけ挿入が実行されてしまうみたいなんです。

だもんで☆の関数を「中に」でなく「外に」とすれば、『複数』は『1つ』にできるって話なんですが、でもそれだと、そもそもの目的である★が実現できません。

鬼のように厄介ですが、これって解決できますか??

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

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

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

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

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

guest

回答3

0

こういうことですか?

javascript

1$(function(){ 2 $('button').click(function(){ 3 var innerType=$(this).data('innertype'); 4 var target=$('.inner').filter(function(){return $(this).data('innertype')==innerType;}); 5 $('.outer').fadeOut().queue(function(){ 6 if($(this).find(target).length>0){ 7 cat(target); 8 dog(target); 9 } 10 $(this).dequeue(); 11 }).fadeIn().queue(function(){ 12 if($(this).find(target).length>0){ 13 ape(target); 14 } 15 $(this).dequeue(); 16 }); 17 }); 18}); 19function cat(target){ 20 target.append('<p>cat</p>'); 21} 22function dog(target){ 23 target.append('<p>dog</p>'); 24} 25function ape(target){ 26 target.append('<p>ape</p>'); 27}

調整

javascript

1$(function(){ 2 $('button').click(function(){ 3 var innerType=$(this).data('innertype'); 4 var target=$('.inner').filter(function(){return $(this).data('innertype')==innerType;}); 5 $.when($('.inner').fadeOut().queue(function(){ 6 if($(this).filter(target).length>0){ 7 cat(target); 8 dog(target); 9 } 10 $(this).dequeue(); 11 })).done(function(){ 12 $('.inner').filter(target).fadeIn().queue(function(){ 13 ape(target); 14 $(this).dequeue(); 15 }); 16 }); 17 }); 18}); 19function cat(target){ 20 target.append('<p>cat</p>'); 21} 22function dog(target){ 23 target.append('<p>dog</p>'); 24} 25function ape(target){ 26 target.append('<p>ape</p>'); 27} 28``` 29 30# 再調整 31解決済み? 32```javascript 33<script> 34$(function(){ 35 $('button').click(function(){ 36 var innerType=$(this).data('innertype'); 37 var target=$('.inner').filter(function(){return $(this).data('innertype')==innerType;}); 38 $.when($('.outer,.inner').fadeOut().queue(function(){ 39 if($(this).filter(target).length>0){ 40 cat(target); 41 dog(target); 42 } 43 $(this).dequeue(); 44 })).done(function(){ 45 $('.outer').has(target).fadeIn(); 46 target.fadeIn().queue(function(){ 47 ape(target); 48 $(this).dequeue(); 49 }); 50 }); 51 }); 52}); 53function cat(target){ 54 target.append('<p>cat</p>'); 55} 56function dog(target){ 57 target.append('<p>dog</p>'); 58} 59function ape(target){ 60 target.append('<p>ape</p>'); 61} 62</script> 63<div class="wrapeer"> 64dummy1 65 <div class="outer" data-outerType="1"> 66dummy2 67 <div class="inner" data-innerType="A">innerA</div> 68 <div class="inner" data-innerType="B">innerB</div> 69 </div> 70 <div class="outer" data-outerType="2"> 71dummy3 72 <div class="inner" data-innerType="C">innerC</div> 73 <div class="inner" data-innerType="D">innerD</div> 74 </div> 75 <button type="button" data-innerType="A" data-outerType="1">A</button> 76 <button type="button" data-innerType="B" data-outerType="1">B</button> 77 <button type="button" data-innerType="C" data-outerType="2">C</button> 78 <button type="button" data-innerType="D" data-outerType="2">D</button> 79</div> 80```

投稿2019/10/18 05:56

編集2019/10/18 06:46
yambejp

総合スコア116661

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

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

yambejp

2019/10/18 06:01

全体をfadeoutをするとして、fadeinは指定した.innerとその親の .outerだけなのでしょうか? イマイチ説明が入ってきません
kannmuri

2019/10/18 06:09

ありがとうございますー! 質問ではフェードアウトとインの要素は別々になっていると思うのでそこは変えたくなくて、たとえばAクリックのときは .ouer1 と .innerA だけを表示し、他を非表示にしたいです。 あと質問では挿入イベントですが実際はいろいろあるので、「<p>cat</p>の数で判定する」というより、「cat(); が実行済みかどうかで判定する」みたいな処理があればありがたいんですが、調べてもないんですよねそんなの…w
kannmuri

2019/10/18 06:11

>fadeinは指定した.innerとその親の.outerだけなのでしょうか? ですです!細かくいいますと、「親の」っていうより、「クリックしたボタンのデータ属性の」っていう感じで考えております!
yambejp

2019/10/18 06:20

outerを非表示にする必要ない気がします。 すべてinnerで完結していませんか?
kannmuri

2019/10/18 06:41 編集

質問は簡略版というかんじにしてますが、実際には .inner と .outer の間にもいっこ要素があって、そいつはfadeの対象にしたりしなかったりするので、やっぱり必要ですね。
kannmuri

2019/10/18 06:47

解決しました!いろんなテクを伝授してくれてありがとうございます。 でもお使いの $.when() ですけど、deferred ってなくてもいいんですか?
yambejp

2019/10/18 06:48 編集

重要な情報は最低限の省略にしてくださいね 情報が後出しされると答えがブレます 解決済みみたいですが一応再調整版あげときました
yambejp

2019/10/18 06:50

deferrd処理はpromiseを返さない非同期処理に使います ちょっと理解しづらいとは思いますが deferredするものとしないものがあることを認識してください
kannmuri

2019/10/18 06:58

>重要な情報は最低限の省略にしてくださいね やーもうこればっかりはほんっとーにすみませんでした。「素人が自己判断で省略するな」って、額に入れて壁にかけて毎日復唱して先祖代々伝えていきます! >deferrd処理はpromiseを返さない非同期処理に使います なるほど!勉強しておきます!
guest

0

ベストアンサー

あまり理解できていなんですが、

before

1$('.outer, .inner').fadeOut(200, function() { 2 cat(); dog(); 3}); 4$('.outer[data-outerType="'+outerType+'"], .inner[data-innerType="'+innerType+'"]').delay(200).fadeIn(200, function() { 5 ape(); 6});

の部分を

after

1$('.outer').fadeOut(200, function() { 2 cat(); dog(); 3}); 4$('.inner').fadeOut(200); 5 6$('.outer[data-outerType="'+outerType+'"], .inner[data-innerType="'+innerType+'"]').delay(200).fadeIn(200, function() { 7 ape(); 8}); 9$('.inner[data-innerType="'+innerType+'"]').delay(200).fadeIn(200);

に変更するのはダメでしょうか?(innerクラスに対してはcat() dog() ape()を行わなず、表示操作のみ行う)

追記:
すみません1つという要件を見逃していました。このコードで実現できます。

replace

1$('button').click(function(){ 2 const outerType = $(this).attr('data-outerType'); 3 const innerType = $(this).attr('data-innerType'); 4 $('.outer').fadeOut(200, function() { 5 if ($(this).attr('data-outerType') === outerType) { 6 cat(); dog(); 7 } 8 9 }); 10 11 $('.inner').fadeOut(200, function() { 12 }); 13 14 $('.outer[data-outerType="'+outerType+'"]').delay(200).fadeIn(200, function() { 15 ape(); 16 }); 17 18 $('.inner[data-innerType="'+innerType+'"]').delay(200).fadeIn(200, function() { 19 }); 20 21}); 22 23function cat(outerType){ 24 $('.outer').append('<p>cat</p>'); 25} 26function dog(outerType){ 27 $('.outer').append('<p>dog</p>'); 28} 29function ape(){ 30 $('.outer').append('<p>ape</p>'); 31}

fadeout関数の中で呼ばれる$(this)は
現在fadeOutしているjQueryObjectを指します。
その為、「.outer」が2つ(outer-typeが2つ)あっても
押下したボタンから取得したouter-typeに合致する場合のみしか処理をしない
(outer要素は2つ消すが、cat()とdog()は1つのouter要素にしか処理をしない)
という動作を実現しています。

投稿2019/10/18 06:15

編集2019/10/18 06:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kannmuri

2019/10/18 06:22

なるほど、.inner を fade の対象から外せば『6つ』から『2つ』になりましたね。でも『1つ』がいいんです。笑
退会済みユーザー

退会済みユーザー

2019/10/18 06:33 編集

追記しましたので回答の方ご確認ください!
kannmuri

2019/10/18 06:43

はっはーん!なるほど!どうもありがとうございます!
guest

0

.promise().done() と記述することで全体の終了を待てます。

jQuery

1 $('.outer,.inner').fadeOut(200).promise().done(function() { 2 cat(); 3 dog(); 4 $('.outer[data-outerType="'+outerType+'"],.inner[data-innerType="'+innerType+'"]').fadeIn(200).promise().done(function() { 5 ape(); 6 }); 7 });

https://api.jquery.com/fadeOut/
https://api.jquery.com/fadeIn/
https://api.jquery.com/promise/#example-1

投稿2019/10/18 08:44

x_x

総合スコア13749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問