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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア1698
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
総合スコア200
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総合スコア1698
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/08 04:01
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/08 05:21
2015/05/08 05:32