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

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

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

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

Q&A

解決済

2回答

4108閲覧

javascriptでイベントを削除する方法

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

1グッド

3クリップ

投稿2018/02/06 14:55

次のように、おはようとおやすみをjavascriptで「ふんわり表示」しているのですが、

html

1<div class="hyoji">表示</div> 2 <div class="nakami1"> 3 <div id="ohayo">おはよう</div> 4 </div> 5 <div class="nakami2"> 6 <div id="oyapumi">おやすみ</div> 7</div> 8<div class="modosu">戻す</div>

javascript

1<script> 2$('body').on("click",'.hyoji',function(){ 3 $('.nakami1').fadeIn(1000).delay(3000).fadeOut(1000); 4 $('.nakami2').fadeIn(5000).delay(1000); 5}); 6</script>

この「ふんわり表示」をリセットする方法がわかりません。

次のように書いてもうまくいかないので、間違っているところを教えて頂けませんでしょうか?

javascript

1<script> 2// 「表示」による内容を削除 3$('body').on("click",'.modosu',function(){ 4 $('.nakami1').css('display', 'none'); 5 $('.nakami2').css('display', 'none'); 6}); 7 8// 「表示」によるイベントをリセット★★これがダメ★★ 9var events = []; 10Object.keys($._data($('body').get(0), "events")).forEach(function(k) { 11 events[k].forEach(function(o) { 12 events.push({ 13 handler: o.handler, 14 selector: o.selector, 15 }); 16 }); 17}); 18$(document).off("click", ".hyoji"); 19</script>

上のコードを書いた実際の動作はこちらです。
https://jsfiddle.net/fosnxn2a/

どうぞ宜しくお願い致します。

umyu👍を押しています

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

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

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

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

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

guest

回答2

0

要は表示を押下後にアニメーション中に戻るボタンを押下した時、アニメーションを止めて、
再度、表示ボタンを押下しても、最初からアニメーションを行ってほしいということですね?

であれば、簡単なことです。
stop関数には引数を2つ取れます。
一つは、アニメーションキューをクリアするか
もう一つは、直ちにアニメーションを終了の状態にまで持っていくか。

この場合は、戻るボタン押下時に、stop関数の引数に両方ともtrueを指定してアニメーションを直ちに止めて、次のアニメーションも行わないようにして非表示にしてしまえば良いのです。

Javascript

1$('body').on("click",'.hyoji',function(){ 2 $('.nakami1').fadeIn(1000).delay(3000).fadeOut(1000); 3 $('.nakami2').fadeIn(5000).delay(1000); 4$('body').on("click",'.modosu',function(){ 5 $('.nakami1').stop(true,true).hide(); 6 $('.nakami2').stop(true,true).hide(); 7});

stop関数の詳しい動作については、以下のAPI Documentか、Qiitaの記事を読んでください。

jQuery API Document
Qiita:【jQuery】stopメソッドを理解する

投稿2018/02/07 04:05

LineOfLightning

総合スコア253

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

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

jerome.dupuis

2018/02/07 04:21

stop(true, true)は確かにベストですね!しかし、また「表示」をクリックすると、アニメーションがリセットされずに、イベントを重ねる。 ですので、こうなります ↓ $('body').on("click",'.hyoji',function(){ $('.nakami1').stop(true,true).hide().fadeIn(1000).delay(3000).fadeOut(1000); $('.nakami2').stop(true,true).hide().fadeIn(5000).delay(1000); }) $('body').on("click",'.modosu',function(){ $('.nakami1').stop(true,true).hide(); $('.nakami2').stop(true,true).hide(); }
LineOfLightning

2018/02/07 04:30

「また「表示」をクリックすると、アニメーションがリセットされずに、イベントを重ねる。」というのは、どんな操作をした時にどんなタイミングで表示をクリックした時ですか? 表示と戻すを交互に押すだけであれば、大丈夫な気がしますが・・・ また、表示ボタン押下時にstop関数を呼び出す方法でもできますが、その場合、戻すボタン押下時のstop関数は不要ですね。
LineOfLightning

2018/02/07 05:05

なるほど。 表示ボタンを連続で押下した場合、ということですね。
退会済みユーザー

退会済みユーザー

2018/02/07 05:32

LineOfLightningさん こんにちは。ご回答どうもありがとうございます。 おお~、それはシンプルで素敵ですね。 >表示と戻すを交互に押すだけであれば、大丈夫な気がしますが 仰るとおりだと思います。 ただ、実は今回はユーザーがいじくるサイトを作っております。ゆえに、そのように「ちゃんと交互に押してくれる」という状況とは限らなそうです。 と、いうわけでして、せっかくシンプルなコードを頂戴したのに恐縮ではございますが、今回はjerome.dupuisさんにベストアンサーを譲ってあげてくださいませ。m(_ _)m stop関数についてのご説明もありがとうございます。
guest

0

ベストアンサー

よっ
ちょっと気になって、方法を探しました。
ひとまず、下記のコードは間違えているので、Javascriptは落ちてます。jsが落ちないように。

var events = []; Object.keys($._data($('body').get(0), "events")).forEach(function(k) { events[k].forEach(function(o) { events.push({ handler: o.handler, selector: o.selector, }); }); });

上記のコードが要らないから、使ってないです。

下記は私の方法です。

<div class="hyoji">表示</div> <div class="nakami1"> <div id="ohayo">おはよう</div> </div> <div class="nakami2"> <div id="oyapumi">おやすみ</div> </div> <div class="modosu">戻す</div> <script> $('body').on({ 'click.myevent': function () {      $('.nakami1').fadeIn(1000).delay(3000).fadeOut(1000); $('.nakami2').fadeIn(5000).delay(1000); } }, '.hyoji'); $('body').on("click",'.modosu',function(){ $('.nakami1').css('display', 'none'); $('.nakami2').css('display', 'none'); }); $('body').off('click.myevent', '.hyoji'); </script>

:)

投稿2018/02/06 16:32

jerome.dupuis

総合スコア172

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

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

退会済みユーザー

退会済みユーザー

2018/02/06 17:37

こんばんは。ありがとうございます。 そちらですと、 https://jsfiddle.net/fosnxn2a/1/ どうやら、、、(>_<) また何か思いつくことがございましたらぜひご意見くださいませ。
jerome.dupuis

2018/02/06 23:56

あれ?合ってないですか?表示っていうボタンがリセットされたよね。 質問がちゃんと理解出来てないかもしれない。
退会済みユーザー

退会済みユーザー

2018/02/07 00:18 編集

なるほど! >この「ふんわり表示」をリセットする方法がわかりません。 こう書いた私が悪いです。 くわしく書きますと、「ふんわり表示」は何度も実行したいけれど、「戻す」を押したときに、【ふんわりした動きだけを、リセットさせたい】のです。 「実行」を押したら「ふんわり表示」させて、「戻す」を押したらふんわり表示がなくなり、また「実行」を押したら「ふんわり表示」が【はじめから】始まる。という作動が希望です。 この【はじめから】が質問のコードではできていなかったため、【はじめから】の意味で >この「ふんわり表示」を【リセット】する方法がわかりません。 と書いたつもり、、でした???? 質問のコードだと、「ふんわり表示」が終わってから「表示」を押せば、またふんわり表示するのですけれど、そうじゃなく、「ふんわり表示」の途中で「戻す」を押したら、その時点でふんわりした動きはリセットしてほしい。と、このような意味でした。
miyabi_takatsuk

2018/02/07 02:43

横槍失礼します。 jQueryのアニメーションを途中で中断させたいときは、 stop()関数を使うとできます。 $(要素).stop().fadein(200); とか $(要素).stop().css('display', 'none'); とか。 おそらく、アニメーションさせている途中でcss('display', 'none'); を効かせているから、アニメーションの断続によって、表示が更新されているのだと思います。 (fadein、fadeout関数も、内部的には、animate関数を実行していますので、stop関数が有効です)
jerome.dupuis

2018/02/07 02:52 編集

コメントありがとうございます。 stop()を試してみたが、ちゃんとリセットされてないですね。ただアニメーションは途中に止まっちゃう。
miyabi_takatsuk

2018/02/07 02:53

そうだ、リセットしないといけないですもんね・・・。 失礼しました。
jerome.dupuis

2018/02/07 02:59 編集

よっ fadeInやfadeOutのアニメーションを途中に切って、リセットするのはちょっとやりずらいですので、 クリックする時に、表示したいHTMLを再作成。そうすると、イベントがリセットされます。 試してみて:) <script> var resetNakami = function() { $('.nakami1, .nakami2').each(function() { var clone = $(this).clone() $(this).replaceWith(clone) clone.hide() }) } $('body').on({ 'click.myevent': function () { resetNakami()     $('.nakami1').stop().fadeIn(1000).delay(3000).fadeOut(1000); $('.nakami2').stop().fadeIn(5000).delay(1000); } }, '.hyoji'); $('body').on("click",'.modosu', resetNakami) </script>
退会済みユーザー

退会済みユーザー

2018/02/07 05:27

めっちゃ嬉しいです。できました!!遅くなってしまってすみません。他のコードと組み合わせるのに苦労しておりました。なんとか、、できました。(∩´∀`)∩ たびたびご返信くださって誠にありがとうございます!!感謝です★
退会済みユーザー

退会済みユーザー

2018/02/07 05:34

めっちゃ嬉しい………
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問