2016-09-03 13 views
2

私は、複数回のスクロールイベントを防止しようとしています。 250msで1つのイベントのみ。このため私は以下のインターネットでデバウンス機能を見つけました。しかし、私はそれを正しく使うことができませんでした。なにが問題ですか?関数を返すdebounce機能以来スクロールイベントで複数の火災を防ぐ方法は?

function debounce(func, wait, immediate) { 
    var timeout; 
    return function() { 
    var context = this, args = arguments; 
    var later = function() { 
     timeout = null; 
     if (!immediate) func.apply(context, args); 
    }; 
    var callNow = immediate && !timeout; 
    clearTimeout(timeout); 
    timeout = setTimeout(later, wait); 
    if (callNow) func.apply(context, args); 
    }; 
}; 

// my code.. 
$(window).on('scroll', function (e) { 

    debounce(function() { 
    // The stuff below doesn't work. 
    var scrollTop = $(window).scrollTop(); 
    if (scrollTop > 50) { 
     $('.title').addClass('fixedPosition'); 
    } else { 
     $('.title').removeClass('fixedPosition'); 
    }  
    }, 250); 

}); 
+0

ウィンドウオブジェクトにミューテックスを追加し、setTimeout関数を使用して250msごとに非同期にリリースします。 –

+0

ラップを削除します'on'のハンドラ引数として__call__' debouce'だけを使用します。 – Teemu

+0

議論された[ここ](http://stackoverflow.com/questions/39272182/optimize-scroll-speed-for-internet-explorer-11/39273882#39273882)と同様です。 return => 'debounce(function(){/ ** /}()、250); –

答えて

2

、あなたはまだそれを呼び出す必要があります:

$(window).on('scroll', function (e) { 
    debounce(function() { 
     var scrollTop = $(window).scrollTop(); 
     if (scrollTop > 50) { 
      $('.title').addClass('fixedPosition'); 
     } else { 
      $('.title').removeClass('fixedPosition'); 
     }  
    }()/*note the call here*/, 250); 
}); 

機能myLogicが自動的に呼び出されます、一方、これは別の関数であなたのデバウンスロジックをラップと同じではありません:

function myLogic(){ 
    var scrollTop = $(window).scrollTop(); 
    $('.title').toggleClass('fixedPosition', scrollTop > 50); 
} 

$(window).on('scroll', debounce(myLogic, 250)); 
+0

ありがとう、それは動作します。関数呼び出し時間を記録しました。結果:1472906895811 1472906895835 1472906895855 1472906895874 1472906895898 1472906895922 1472906895944 1472906895966。ペリヨドは250ms以下と思われる。どうして? – horse

+0

おそらく、デバウンスの代わりにスロットルをしたいのですか? [difference](http://jsfiddle.net/missinglink/19e2r2we/)を参照してください。 –

+0

はい、スロットルが必要です。私は上記のコードはスロットルのように振る舞うと思います。ちょうど名前が間違っていますか? – horse

関連する問題