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

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

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

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

Q&A

解決済

3回答

7584閲覧

jqueryの$(window).scroll(function () {}でスクロールするたびに実行されてしまいます。

hiro421

総合スコア63

jQuery

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

0グッド

1クリップ

投稿2015/05/08 03:16

lang

1$(window).scroll(function () { 2 var s = $(this).scrollTop(); 3 var m = 20500; 4 if(s > m) { 5 var num = 0; 6 var tgt = 35; 7 var speed = 15; 8 setInterval(function(){ 9 if(num <= tgt){ 10 $('.counter05').html(num); 11 num++; 12 } 13 },speed); 14 } 15 });

一定のところまできたら数字がカウントアップするようなソースを書いたのですが、
スクロールするたびに実行されてしまいます。。
こちらどのような処理をすればよいのでしょうか。。
ご教授よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

複数の場合を載せます。
これはかなり単純に考えたので、希望通りの動作をするかかなり怪しいです。ですので、参考程度に留めておいてください。

lang

1var timers = []; //setIntervalを設定した個数 2var timersMax = 2; //ここで数字をカウントアップする個数を決定 3//カウントアップする関数を定義 4var countUp = function(tgt, speed, selector){ 5 var num = 0; 6 timers[timers.length] = setInterval(function(){ 7 if(num <= tgt){ 8 $(selector).html(num); 9 num++; 10 } 11 }, speed); 12}; 13 14$(function(){ 15 $(window).on("scroll", function(){ 16 var s = $(this).scrollTop(); 17 var m = 2800; 18 if(s > m){ 19 if(timers.length < 1){ 20 countUp(1, 15, '.counter01'); 21 } 22 } 23 m = 5800; 24 if(s > m){ 25 if(timers.length < 2){ 26 countUp(3, 15, '.counter02'); 27 } 28 } 29 //ここでスクロールイベントを解除 30 if(timers.length >= timersMax){ 31 $(window).off("scroll"); 32 } 33 }); 34});

投稿2015/05/08 05:20

編集2015/05/08 05:20
orange0190

総合スコア1698

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

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

orange0190

2015/05/08 05:21

これを考えているうちにokayu3さんがより良い方法を載せていましたね・・・ そちらを参考にしてください。
hiro421

2015/05/08 05:32

ありがとうございます! こちらも質問不足で申し訳ありませんでした。。 なんとお礼を申し上げたらよいかわかりません。。 今後ともよろしくお願いいたします!!
guest

0

ベストアンサー

複数設置する場合は、offするんじゃなくて、1個終わったら 終わったフラグを立てておく、
ということになりますね。たとえば

lang

1//イベント発火位置、対象class、ターゲット、処理済みフラグを管理します。 2var set_scroll_counter = [{ 3 loc: 2800, 4 cls_cnt: '.counter01', 5 target: 1, 6 done: 0 7}, { 8 loc: 5800, 9 cls_cnt: '.counter02', 10 target: 3, 11 done: 0 12}, { 13 loc: 20500, 14 cls_cnt: '.counter05', 15 target: 35, 16 done: 0 17}]; 18 19 20$(window).on("scroll", function () { 21 var i, ilen, one, num, m, found = false, 22 speed = 15, 23 s = $(this).scrollTop(), 24 arr = set_scroll_counter; 25 //未処理のデータセットを探します。 26 for (i = 0, ilen = arr.length; i < ilen; i++) { 27 one = arr[i]; 28 if (one.done === 0) { 29 m = one.loc; 30 found = true; 31 break; 32 } 33 } 34 //未処理セットがあり、かつ発火地点に到達していたら、カウントアップ開始。 35 if (found && (s > m)) { 36 num = 0; 37 setInterval(function () { 38 if (num <= one.target) { 39 $(one.cls_cnt).html(num); 40 num++; 41 } 42 }, speed); 43 one.done = 1;//処理済みフラグを立てる。 44 } 45});

と、こんな風に。
さらに増やすには、データセットを追加するだけでOKですね。
わかりやすく データセットを探すロジックと、イベント発火ロジックを
分けて書きました。(jsbeautifier + jsLint 処理済み)

投稿2015/05/08 05:10

okayu3

総合スコア200

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

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

hiro421

2015/05/08 05:31

ありがとうございます! 希望通りの動きになりました! とても参考になりました!
okayu3

2015/05/08 05:41

よかったです。データと処理を分けることを意識してくださいね。 そうすると必ずいいコードになります。
guest

0

ある程度スクロールしたら数字が自動で増えていくという考えでよろしいですか?
でしたら、以下のようにしたらどうでしょうか?

lang

1$(window).on("scroll", function(){ 2 var s = $(this).scrollTop(); 3 var m = 20500; 4 if(s > m) { 5 var num = 0; 6 var tgt = 35; 7 var speed = 15; 8 setInterval(function(){ 9 if(num <= tgt){ 10 $('.counter05').html(num); 11 num++; 12 } 13 },speed); 14 $(window).off("scroll"); 15 } 16});

投稿2015/05/08 03:31

編集2015/05/08 03:32
orange0190

総合スコア1698

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

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

hiro421

2015/05/08 04:01

ありがとうございます! 希望の動きになったのですが、これを複数設置する場合はどのように記述すればよいのでしょうか。。 質問不足で申し訳ありません。 20500とさせていただいてるのですが、 この数値が複数あってそれぞれ違う数字がカウントアップさせるようにしたいのです。 $(window).on("scroll", function(){ var s = $(this).scrollTop(); var m = 2800; if(s > m) { var num = 0; var tgt = 1; var speed = 15; setInterval(function(){ if(num <= tgt){ $('.counter01').html(num); num++; } },speed); $(window).off("scroll"); } }); $(window).on("scroll", function(){ var s = $(this).scrollTop(); var m = 5800; if(s > m) { var num = 0; var tgt = 3; var speed = 15; setInterval(function(){ if(num <= tgt){ $('.counter02').html(num); num++; } },speed); $(window).off("scroll"); } });
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問