【问题标题】:How can I make this jQuery listener not fire multiple times?如何让这个 jQuery 监听器不会多次触发?
【发布时间】:2012-04-30 03:51:18
【问题描述】:

我目前有以下功能,可以有效地从 Django 检索 JSON 并通过无限滚动加载电影。但是,我发现有时这个事件会触发多次,最终会得到两次相同的页面。

$(window).scroll(function() {
  var break_point = $(document).height() - ($(window).height() * 1.02);
  if ($(window).scrollTop() >= break_point) {
    var timePeriod = $('.tab-content').find('.active').attr('id');
    var nextPage = $('#'+timePeriod+' ul li:last').attr('data-next');
    if (nextPage) {
      loadMovies(timePeriod, nextPage);
    }
  }
});

阻止此侦听器在每页执行多次的最佳方法是什么?

【问题讨论】:

标签: jquery ajax infinite-scroll


【解决方案1】:

感谢 Rob 的帮助!我只是发布我最终做的事情以供其他人参考。我使用了 underscore.js 库的 debounce 函数。

var infiniteScroll = _.debounce(function() {
  var break_point = $(document).height() - ($(window).height() * 1.02);
  if ($(window).scrollTop() >= break_point) {
    var timePeriod = $('.tab-content').find('.active').attr('id');
    var nextPage = $('#'+timePeriod+' ul li:last').attr('data-next');
    if (nextPage) {
      loadMovies(timePeriod, nextPage);
    }
  }
}, 250);

$(window).scroll(infiniteScroll);

【讨论】:

    【解决方案2】:

    使用 .one('scroll', function() 代替 .scroll(function()

    http://api.jquery.com/one/

    考虑到您的功能,您可能必须在重新加载时重新附加处理程序。但是 one() 将确保它只在您附加后触发一次。

    【讨论】:

    • 嘿,在它触发后我将如何重新连接处理程序?
    • 例如,您可以将带有 one() 的代码放入一个函数中,然后在准备好的文档中调用该函数,然后在返回时再次调用它。或者,您可以(相同的功能)保持原样,将其放在一个函数中,但是当您第一次进行 ajax(大概?)调用时,调用 unbind,然后在成功时再次调用该函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多