2010-12-12 63 views
1

我使用以下代码来查明查看者正在访问的页面的哪一部分(类似Google书籍,以查找正在查看的页面):减少.resize和.scroll方法的调用次数

$("#main-content").scroll(function() { 
      Nx.curPage = (Math.round($(this).scrollTop()/620)+1); 
      window.location.hash = "#"+Nx.curPage; 
      Nx.select(undefined); 
     }); 

也在另一部分我使用$(window).resize(...)来适合我的内容在当前窗口大小,这是调用每一个调整大小。正如你可以想象的那样,这会使页面变慢,特别是在较老的硬件上。有什么办法可以实现什么时候滚动或调整大小停止,然后开始做的东西,所以减少进程的数量?有点像$("#main-content").scrollStop ???

回答

6

你可以做两件事。

1)设置超时,使大小调整/滚动经过一番空闲状态情况:

var timeout; 
$("#main-content").scroll(function() { 
    clearTimeout(timeout); 
    timeout = setTimeout(function(){ 
     Nx.curPage = (Math.round($(this).scrollTop()/620)+1); 
     window.location.hash = "#"+Nx.curPage; 
     Nx.select(); // note: undefined is passed by default 
    }, 200); 
}); 

2)限制呼叫的次数/秒:

var lastScroll = 0; 
$("#main-content").scroll(function() { 
    var now = +new Date; 
    if (now - lastScroll > 100) { // only execute if (elapsed > 100ms) 
    Nx.curPage = (Math.round($(this).scrollTop()/620)+1); 
    window.location.hash = "#"+Nx.curPage; 
    Nx.select(); 
    lastScroll = now; 
    }   
}); 

+0

ms的数量当然只是例子。你可以和他们一起玩,以获得最好的结果。 – galambalazs 2010-12-12 08:53:40

1

请尝试下面的功能。它会检查用户是否滚动过某个特定的号码。但是该功能仅在设置的时间间隔(下面示例中每秒钟5次)触发,而不是在滚动期间连续触发。

var scrollCheck; 

    $(window).on('scroll', function() { 
     clearInterval(scrollCheck); 
     scrollCheck = setInterval(function(){ 
      clearInterval(scrollCheck); 
      scrollPosition = $(this).scrollTop(); 
          scrollAmount = 150 // no. of pixels that have been scrolled from top 

      if(scrollPosition > scrollAmount){ 
       alert('scrolled past point') 
      }else{ 
       alert('not scrolled past point') 
      } 

     },200); 
    });