Javascript 在jQuery和can'中处理无限负载;t让Load函数只加载一次

Javascript 在jQuery和can'中处理无限负载;t让Load函数只加载一次,javascript,jquery,Javascript,Jquery,我正在开发一个无限负载(例如,惰性负载)类型的功能,这是迄今为止的功能: $(window).scroll(function() { var ScrollPosition = $(window).scrollTop() + $(window).height(); var LoadMorePosition = $(document).height()-100; if( ScrollPosition == LoadMorePosition ) {

我正在开发一个
无限负载
(例如,惰性负载)类型的功能,这是迄今为止的功能:

$(window).scroll(function() {
       var ScrollPosition = $(window).scrollTop() + $(window).height();
       var LoadMorePosition = $(document).height()-100;
       if( ScrollPosition == LoadMorePosition ) {
           console.log('loading more');
           loadMoreItems();
       }
    });
它在大多数情况下都能正常工作,只是当用户滚动到阈值时,
loadMoreItems
函数会被调用20-30次

我在想setTimeout类型的东西可能会起作用,但转念一想,我意识到它只有在Ajax内容加载足够快的情况下才能起作用(这并不能保证)

我需要的是一种方法来检测他们是否达到阈值,然后只调用该函数一次,直到他们再次达到滚动阈值

我在想setTimeout类型的东西可能会起作用,但转念一想,我意识到它只有在Ajax内容加载足够快的情况下才能起作用(这并不能保证)

然后,不要依赖超时,而是在AJAX请求成功\完成时重置标志

我在想setTimeout类型的东西可能会起作用,但转念一想,我意识到它只有在Ajax内容加载足够快的情况下才能起作用(这并不能保证)


然后,不要依赖超时,而是在AJAX请求成功\完成时重置标志。

您可以这样做:

var loadOnce = function(fn) {
  var loadedPages = {};
  return function(page) {
    var key = 'p'+page;
    if (typeof loadedPages[key] === 'undefined') {
      fn.apply(fn, arguments);
      loadedPages[key] = true;
    }
  };
};

var loader = loadOnce(function(page) {
  /* Ajax Request */
});

// Will only fire the ajax request once:
loader(1);
loader(1);
loader(1);
loader(1);

你可以这样做:

var loadOnce = function(fn) {
  var loadedPages = {};
  return function(page) {
    var key = 'p'+page;
    if (typeof loadedPages[key] === 'undefined') {
      fn.apply(fn, arguments);
      loadedPages[key] = true;
    }
  };
};

var loader = loadOnce(function(page) {
  /* Ajax Request */
});

// Will only fire the ajax request once:
loader(1);
loader(1);
loader(1);
loader(1);

AJAX调用的成功部分应该设置加载更多内容标志,这样,如果没有更多内容,就不会加载更多内容

对于滚动,设置timeout来检测用户何时停止滚动,然后执行Show loading gif和do ajax,如果成功,则隐藏gif并加载更多:D

$(window).scroll(function(){
  clearTimeout(scrolled);
  scrolled = setTimeout(function(){
  //Your function when user stops scrolling
  }, 100);
});

AJAX调用的成功部分应该设置加载更多内容标志,这样,如果没有更多内容,就不会加载更多内容

对于滚动,设置timeout来检测用户何时停止滚动,然后执行Show loading gif和do ajax,如果成功,则隐藏gif并加载更多:D

$(window).scroll(function(){
  clearTimeout(scrolled);
  scrolled = setTimeout(function(){
  //Your function when user stops scrolling
  }, 100);
});

我认为这样做的唯一方法是使用全局Javascript变量,但我听说这些都不好。这是唯一的选择吗?@Talon,只要你能控制它们,就没那么糟糕了。无论如何,你可以为你的变量创建一个“名称空间”(googleit),或者将标志保存在一个隐藏的输入中。我认为这样做的唯一方法是使用一个全局Javascript变量,但我听说这些都不好。这是唯一的选择吗?@Talon,只要你能控制它们,就没那么糟糕了。无论如何,您可以为您的变量创建一个“名称空间”(googleit),或者将该标志保存在一个隐藏的输入中。