【问题标题】:Jquery .on('scroll') not firing the event while scrollingJquery .on('scroll')在滚动时不触发事件
【发布时间】:2023-03-21 07:10:01
【问题描述】:

滚动ul 时未触发滚动事件。我正在使用 jQuery 版本 1.10.2。当我从 ajax 页面加载 ul 时,我无法使用 $('ulId').on('scroll', function() {}); 或其他实时方法。请帮助我找到解决方案。

$(document).on( 'scroll', '#ulId', function(){
    console.log('Event Fired');
});

【问题讨论】:

  • 是ul的id。
  • # for id-selector '#ulId'
  • 你的ul有卷轴吗?那么应该没有任何问题,否则您可以尝试使用window。
  • 您可能需要为 ul 添加高度。

标签: jquery events scroll


【解决方案1】:

您可能忘记在 id 之前为 id 选择器提供#,您需要在id 之前提供#ulId

您可能需要在包含 ul 和滚动条的 div 上绑定滚动事件。您需要使用 div 而不是 `ul` 绑定事件
$(document).on( 'scroll', '#idOfDivThatContainsULandScroll', function(){
    console.log('Event Fired');
});
罢工>

编辑

上述方法不起作用,因为滚动事件不会在用于事件委托的 DOM 中冒泡,请参阅此问题 why doesn't delegate work for scrolling

但是对于现代浏览器 > IE 8,您可以通过其他方式进行操作。您可以使用 javascript document.addEventListener 进行事件捕获,而不是使用 jquery 进行委托,第三个参数为 true;看看这个tuturial 中的冒泡和捕获是如何工作的。

Live Demo

document.addEventListener('scroll', function (event) {
    if (event.target.id === 'idOfUl') { // or any other filtering condition        
        console.log('scrolling', event.target);
    }
}, true /*Capture event*/);

如果您不需要事件委托,那么您可以直接将滚动事件绑定到 ul,而不是通过document 进行委托。

Live Demo

$("#idOfUl").on( 'scroll', function(){
   console.log('Event Fired');
});

【讨论】:

  • 如果是这样,为什么不$('#ulId').on('scroll',function(){ console.log('Event Fired'); })
  • @IIIOXIII 在问题中他说他不能使用$('ulId').on('scroll', function() {});,因为 UL 是从 Ajax 加载的
  • 您可能需要在包含 ul 的 div 上绑定滚动事件,将事件绑定到 div 而不是 ul
  • @Adil 正如我更新的答案中所建议的那样,我同意,在使用 ajax 加载内部 html 之前,将滚动事件绑定到一个隐藏或没有大小的外部 div。然后在加载时显示外部 div。
  • 我的问题的答案是滚动不是一个冒泡的事件,所以它不能与 on() 一起正常工作,这在 jquery 的 on() 文档中提到。
【解决方案2】:

在 ul 加载后使用 ajax 绑定滚动事件解决了这个问题。在我的发现中 $(document).on( 'scroll', '#id', function () {...}) 不起作用,并且在发现 ajax 加载工作后绑定滚动事件。

$("#ulId").bind('scroll', function() {
   console.log('Event worked');
}); 

您可以在移除或替换 ul 后取消绑定事件。

希望它可以帮助某人。

【讨论】:

  • 如何在运行时动态绑定?
  • stackoverflow.com/a/29051385/470749 似乎同意你的观点,尽管我很失望,因为我认为使用 .on('scroll... 而不是 .scroll(... 的全部目的是为了捕捉 DOM 的动态变化。
  • 从其他来源,这不起作用,因为显然滚动事件没有冒泡。这会阻止 on('scroll', selector, function) 版本工作,因为它依赖于冒泡的事件。
  • .bind 已从 jQuery 3.0.0 中弃用
【解决方案3】:

使用 VueJS,我尝试了这个问题中的所有方法,但都没有奏效。因此,如果有人在同样的情况下苦苦挣扎:

mounted() {
  $(document).ready(function() { //<<====== wont work without this
      $(window).scroll(function() {
          console.log('logging');
      });
  });
},

【讨论】:

  • 谢谢!我对其他答案不起作用感到非常沮丧。
  • 它可以正常工作...
【解决方案4】:

另一种选择可能是:

$("#ulId").scroll(function () { console.log("Event Fired"); })

参考:Here

【讨论】:

    【解决方案5】:
    $("body").on("custom-scroll", ".myDiv", function(){
        console.log("Scrolled :P");
    })
    
    $("#btn").on("click", function(){
        $("body").append('<div class="myDiv"><br><br><p>Content1<p><br><br><p>Content2<p><br><br></div>');
        listenForScrollEvent($(".myDiv"));
    });
    
    
    function listenForScrollEvent(el){
        el.on("scroll", function(){
            el.trigger("custom-scroll");
        })
    }
    

    看到这篇文章 - Bind scroll Event To Dynamic DIV?

    【讨论】:

      【解决方案6】:

      我知道这是很老的东西,但我解决了这样的问题: 我有父子元素是可滚动的。

         if ($('#parent > *').length == 0 ){
              var wait = setInterval(function() {
                  if($('#parent > *').length != 0 ) {
                      $('#parent .child').bind('scroll',function() {
                        //do staff
                      });
                      clearInterval(wait);
                  },1000);
              }
      

      我遇到的问题是我不知道孩子何时加载到 DOM,但我每秒钟都在检查它。

      注意:如果它很快发生但不是在文档加载后立即发生,这很有用,否则它将无缘无故地使用客户端的计算能力。

      【讨论】:

        【解决方案7】:

        您能否在加载ajax 之前将#ulId 放置在文档中(使用css display: none;),或者将其包装在包含div 中(使用css display: none;),然后在ajax 期间加载内部html页面加载,这样滚动事件将链接到 ajax 之前已经存在的 div?

        那么你可以使用:

        $('#ulId').on('scroll',function(){ console.log('Event Fired'); })
        

        显然用可滚动 div 的实际 id 替换 ulId。

        然后设置css display: block;加载时在#ulId(或包含div)上?

        【讨论】:

        • 从 ajax 页面加载 ul 时,此代码将不起作用。
        • yeah live 已从最新的 jquery 版本中删除..1.7+
        • 如果其他人在改进答案时删除他们的反对票,或者建议如何进一步改进答案,我们将不胜感激。
        【解决方案8】:

        我刚刚解决了页面加载后不会立即出现可滚动元素的问题:

        $(document).ready(function () {
           var checkIt = setInterval(function (){
               if($('body').find('.scrollable-wrapper').length > 0){
                   clearInterval(checkIt);
                   jQuery('.scrollable-wrapper').on('scroll', function () {
                       console.log(1)
                   });
               }
           },100)
        });
        

        发现元素存在后,停止间隔,触发事件监听。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-08
          • 1970-01-01
          • 1970-01-01
          • 2011-08-06
          • 2010-11-17
          • 2015-07-26
          • 1970-01-01
          相关资源
          最近更新 更多