【问题标题】:Reset / disable infinite scroll after AJAX callAJAX 调用后重置/禁用无限滚动
【发布时间】:2013-12-05 15:51:40
【问题描述】:

我正在使用无限 ajax 滚动 (https://github.com/webcreate/infinite-ajax-scroll) 带有过滤功能的插件。我的过滤器可以使用无限滚动,但我的问题是,每当滚动到达一个过滤器的结果末尾时,即使选择了另一个过滤器,它也将不再滚动。因此,我需要在选择过滤器时重置无限滚动,但我在文档中找不到有关如何重置它的任何地方,并且对 JQuery 不是很好,因此无法解决这个问题。

我也有某些过滤器不需要初始滚动,并且还需要一种方法来为它们禁用它。

$('.filter a').click(function() {
    //reset scroll somehow
    //setTimeout("jQuery.ias({container: '#container'})",1000);
    var $this = $(this);
    var URL = $this.attr('href');
    loadMoreItems(URL, $this);
});
return false;
});

jQuery.ias({
    container: '#container', // main container where data goes to append
    item: '.element', // single items
    pagination: '.paginate', // page navigation
    next: '.paginate a', // next page selector
    loader: '<img src="public/img/ajax-loader.gif"/>', 
    noneleft: 'No more discounts for your selection', 
    triggerPageThreshold: '10', 
    trigger: "Load more items",
    history: false, 
    thresholdMargin: -350
});

【问题讨论】:

  • 有一个我们可以看看的 jsFiddle 吗?您是否尝试过简单地将完整的无限滚动初始化重新放置在您希望它重新加载的位置?
  • 这个相关的问答可能会有所帮助,因为它是相关的:stackoverflow.com/questions/25898171/…

标签: jquery ajax infinite-scroll jquery-ias


【解决方案1】:

其他have had the same issue as you;根据作者的说法,目前无法干净地重新初始化 IAS。

所以你的选择似乎是

1) 通过removing the event handlers 硬重置插件并在每次过滤器更改时再次调用jQuery.ias({...})

2) 切换到不同的库。该错误报告中的用户wrote his own - 也许他的解决方案对您有用

【讨论】:

  • 好的,在尝试了其他所有方法后,我决定使用选项 2。无法获得您建议使用我的代码的这个。我现在正在尝试实现另一个我应该能够重新初始化的流行插件。
  • @LeeTee 感谢您的反馈!你改用什么插件了?
  • 我已经去了github.com/paulirish/infinite-scroll。然而,它打破了一切。我希望通过一些调整来解决这些问题!
  • 嗨,我是 IAS 的作者,我发布了一个新版本 (v2),现在使用 bindunbind 方法支持此功能。
  • @fieg 太好了!你能给我举个例子,如何使用绑定和取消绑定事件来解决作者遇到的问题。我遇到了同样的问题,不知道该怎么做。
【解决方案2】:

就像 janfoeh 所说,没有什么可以正确地重新初始化插件。您应该从窗口中取消绑定滚动并再次调用元素上的 init。

我建议您将您的初始化封装到一个函数中,以使重新初始化变得容易。

$('.filter a').click(function() {
    $(window).unbind('scroll');
    initscroll();
});

function initscroll(){
    jQuery.ias({
        container: '#container', // main container where data goes to append
        item: '.element', // single items
        pagination: '.paginate', // page navigation
        next: '.paginate a', // next page selector
        loader: '<img src="public/img/ajax-loader.gif"/>', 
        noneleft: 'No more discounts for your selection', 
        triggerPageThreshold: '10', 
        trigger: "Load more items",
        history: false, 
       thresholdMargin: -350
    });
}
initscroll();

所以你必须在加载和过滤时调用initscroll。

【讨论】:

  • 当我需要停用滚动但 initscroll 似乎没有重新激活它时,解除绑定起作用。
  • 您是否将您的 init 包装到 initscroll 函数中?
  • 什么都没有。我试过将函数放在文档内部和外部,但似乎没有什么区别。
  • 我在 initscroll() 中添加了一个警报,以确保它被正确调用,它只是不会重新初始化 jQuery.ias。
  • 试试$('#container').unbind('scroll');
【解决方案3】:

Infinite Ajax Scroll 的第 2 版开始,设计了一种新方法来处理此类问题。调用新方法 destroy() 作为 unbind() 的别名,您将解除 IAS 与任何窗口或文档事件的绑定。之后您可以重新绑定 IAS 对象。

$('.filter a').click(function() {
    setTimeout(function() { 
      ias.destroy(); 
    }, 1000);

    var $this = $(this);
    var URL = $this.attr('href');
    loadMoreItems(URL, $this);

    ias.bind();
});  

类似的东西,没有测试。您可以在http://infiniteajaxscroll.com/docs/methods.html查看此方法

【讨论】:

  • 嗨@Eugen Zaharia,我在我的代码上尝试了你的解决方案,但不起作用。你能检查我的问题吗? stackoverflow.com/questions/24419462/…
  • 如果loadMoreItems 函数花费的时间少于 1000 毫秒,这将不起作用,因为 destroy 将在 bind 之后调用
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
相关资源
最近更新 更多