2014-03-31 38 views
0

我有jQuery函数counter,我需要调用它,当我滚动页面调用函数一次

$(document).ready(function() { 

    $.fn.counter = function() { 
     $(this).each(function() { 
      var num = $(this).data('counter'); 
      var i = 1, 
       self = $(this).html(i); 
      var interval = setInterval(function() { 
       self.html(++i); 
       if (i >= num) { 
        clearInterval(interval); 
       } 
      }, 100); 
     }); 
    }; 

    $(window).scroll(function() { 
     var height = $(window).scrollTop(); 

     if(height > 300) { 
      $('.counter-1, .counter-2, .counter-3, .counter-4').counter(); 
     } 
    }); 

}); 

问题是,当我再次滚动向上或向下翻页功能,每一次又一次打来电话,再次。

我试图用这个代码

$(document).ready(function() { 

    $.fn.counter = function() { 
     $(this).each(function() { 
      var num = $(this).data('counter'); 
      var i = 1, 
       self = $(this).html(i); 
      var interval = setInterval(function() { 
       self.html(++i); 
       if (i >= num) { 
        clearInterval(interval); 
       } 
      }, 100); 
     }); 
    }; 

    $(window).one('scroll', function() { 
     var height = $(window).scrollTop(); 

     if (height > 300) { 
      $('.counter-1, .counter-2, .counter-3, .counter-4').counter(); 
     } 
    }); 

}); 

但在这种情况下,重新加载页面功能不叫了。

有没有办法在滚动上只调用一次函数,不要再调用它,而是在重新加载页面后调用它?

回答

6

您应该使用一个名称空间.on/.off

$(window).on('scroll.custom', function() { 
    var height = $(window).scrollTop(); 

    if (height > 300) { 
     $('.counter-1, .counter-2, .counter-3, .counter-4').counter(); 
     $(window).off('scroll.custom') 
    } 
}); 
+0

是的,我已经尝试过像成才这样http://jsfiddle.net/u6pah/2/。但为什么你使用'scroll.custom',而不是'scroll'? –

+0

@ truslivii.lev,因为我不知道你是否有其他'window.scroll'事件。这只是一个安全因为没有名字空间,你会删除窗口上的每个滚动事件。 –

+0

顺便说一句,你的小提琴不工作,因为你没有滚动条(所以不能真正触发滚动事件或滚动高于300):http://jsfiddle.net/u6pah/3/ –