【问题标题】:Infinite Scroll + .on() function trouble无限滚动 + .on() 函数麻烦
【发布时间】:2012-03-27 18:42:52
【问题描述】:

我正在尝试在由“inview”自定义事件 (https://github.com/protonet/jquery.inview) 触发时设置动态加载的内容(通过无限滚动脚本:http://www.infinite-scroll.com/)的样式。

我的代码如下所示:

$(document).on("inview", ".attachment-portfoliosmall", function(e) {
    if( $.data( this, "styleappended" ) ) {
    return true;
    }
    $.data( this, "styleappended", true ); 
    $(".attachment-portfoliosmall").css('visibility','visible').hide().fadeIn('slow');
    $(".attachment-portfoliosmall").parent(".portfoliopreload").css("background", "none");
});

您可以清楚地看到,使用 $.data 例程是为了确保 .on() 事件处理程序不会对选择过滤器中的每个元素执行多次。

这个代码在理论上工作得很好,除了一旦将下一页上动态加载的内容附加到文档中,.on() 例程就会再次在每个元素上运行,而不仅仅是新添加的元素。

在我的网站上,如果您滚动到下一页,您将看到所有元素淡出并再次淡入,这是由.on() 事件处理程序引起的。

如何防止它在前一页上已处理的元素上执行?

【问题讨论】:

  • 您是否考虑过将“已加载”添加到您的元素类并对其进行过滤?
  • 你能用代码举例说明吗? :) 我对 javascript 很陌生,即使是一些简单的东西也让人望而生畏。

标签: javascript dynamic-data jquery infinite-scroll


【解决方案1】:

这就是我在评论中的意思。

$(document).on("inview", ".attachment-portfoliosmall", function(e) {
    var $this = $(this);
    if(!$this.hasClass('loaded')) {
        $this.addClass('loaded'); 
        $this.css('visibility','visible').hide().fadeIn('slow');
        $this.parent(".portfoliopreload").css("background", "none");
    }
});

类似的东西可能对你有用。

【讨论】:

  • 谢谢,这似乎奏效了!更好的是,它现在只在元素进入视图时才加载它们,而不是一次加载页面上的所有元素。完美的!现在确保这是跨浏览器兼容 sigh
猜你喜欢
  • 2014-06-22
  • 2015-04-12
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
  • 2011-12-23
  • 2023-03-23
相关资源
最近更新 更多