2011-02-08 96 views
7

約翰Resig的建議,以便使用的setInterval(),以減少時間的處理程序被調用次數 - 見http://ejohn.org/blog/learning-from-twitter/附加處理程序窗口滾動事件

從博客文章約翰的解決方案:

var outerPane = $details.find(".details-pane-outer"), 
    didScroll = false; 

$(window).scroll(function() { 
    didScroll = true; 
}); 

setInterval(function() { 
    if (didScroll) { 
     didScroll = false; 
     // Check your page position and then 
     // Load in more results 
    } 
}, 250); 

燦調用連續間隔真的是一個明智的想法?

邁克爾傑克遜的方法會更有意義,因爲它並不意味着我們不斷地進行投票嗎?

邁克爾從評論的解決方案:

var timer = 0; 

$(window).scroll(function() { 
    if (timer) { 
    clearTimeout(timer); 
    } 

    // Use a buffer so we don't call myCallback too often. 
    timer = setTimeout(myCallback, 100); 
}); 

任何人都可以共享任何建議/意見?

+10

誰是邁克爾傑克遜? – Anurag 2011-02-08 03:00:27

+3

我忽略了提及邁克爾傑克遜留下了對約翰雷裏格博客文章 – riscarrott 2011-02-08 15:13:02

回答

1

約翰Resig的方法是最明智的。滾動事件在大多數現代瀏覽器中都被調度了。對於y軸上只有50px的快速滾動操作,可以調度20-30次。如果你在每個事件中都有一個處理程序被調用,你將鎖定UI線程並滾動生成(如John指出的那樣)。

另外,請記住,在現代瀏覽器中,每50ms執行一次快速函數並不是什麼大問題。這是每5或6幀的函數調用。你試圖避免的是每個幀的函數調用,這是使用滾動事件時會發生的情況。

編輯

噢,對不起,我錯過了評論,當我張貼的第一個版本(我只搜索的職位MJ的名字沒有評論)。限制scrollEvent處理程序的速度是一種智能方法+1。我實際上比Resig的策略更喜歡它,因爲你會總是當它發生時得到第一個滾動事件,然後在每100ms之後限制每個其他滾動事件拋出一次。

使用Resig的方法,可能會在通知回調事件之前延遲100ms。 100ms的延遲可能被大量用戶視爲緩慢的界面。

4

我在閱讀同一篇文章,但以一些混合的方式結束。

Jhon Resig和MJ都不適合我。雖然我真的apreciate光他們把我的研究

這裏是我的代碼,這是因爲一旦事件被觸發執行,但運行每250毫秒一次,當它是「重新啓用」

var scrollEnabled = true; 

$(window).on('scroll', function(event) { 
    if (!scrollEnabled) { 
    return; 
    } 
    scrollEnabled = false; 
    console.log('i am scrolling'); 
    return setTimeout((function() { 
    scrollEnabled = true; 
    console.log('scroll enabled now'); 
    }), 250); 
}); 
相關問題