jQuery .on('scroll')滚动时未触发事件


70

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

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

6
它是ul的ID。
ABHILASH SB

1
#为ID-选择'#ulId'
图沙·古普塔- curioustushar

你ul有纸卷吗?那么应该没有任何问题,否则您可以尝试使用window。
2013年

您可能需要为ul添加一个高度。
2013年

Answers:


76

您可能忘记了#为id选择器在id之前给出,您需要#idie之前给出ulId

您可能需要在包含ul和滚动的div上绑定滚动事件。您需要将事件绑定到div而不是ul

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

编辑

上面的方法不起作用,因为滚动事件不会在用于事件委托的DOM中冒泡,请参阅以下问题,为什么不为滚动委托工作?

但是,使用现代浏览器> IE 8,您可以通过其他方式实现。除了使用jquery进行委派外,您还可以使用Java脚本的事件捕获来完成它document.addEventListener,第三个参数为true; 看看如何在这个教程中冒泡和捕捉。

现场演示

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

现场演示

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

2
如果是这样,为什么不呢$('#ulId').on('scroll',function(){ console.log('Event Fired'); })
IIIOXIII

1
@IIIOXIII在问题中他说他不能使用,$('ulId').on('scroll', function() {});因为UL是从Ajax
Nunners

您可能需要在包含ul的div上绑定滚动事件,请用div而不是ul绑定该事件
Adil

@Adil正如我在更新的答案中所建议的那样,我同意,将滚动事件绑定到一个外部div,该外部div是隐藏的或没有大小,然后再用ajax加载内部html。然后仅显示加载时的外部div。
IIIOXIII

12
我的问题的答案是滚动不是一个冒泡的事件,因此它不能与on()一起正常工作,这在jquery的on()文档中已提到。
ZEM

24

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

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

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

希望它可以帮助某人。


在运行期间如何动态绑定?
vipin8169 '16

2
stackoverflow.com/a/29051385/470749似乎同意您的观点,尽管我很失望,因为我认为使用.on('scroll...代替的全部目的.scroll(...是捕捉对DOM的动态更改。
瑞安(Ryan)

从其他来源来看,这是行不通的,因为显然滚动事件不会冒泡。由于它依赖于事件冒泡,因此这会阻止on('scroll',选择器,函数)版本起作用。
戴维·布拉德利

.bind已从jQuery 3.0.0中弃用
-Arosha

17

使用VueJS,我尝试了此问题中的每种方法,但均无效果。因此,万一有人在同样的情况下挣扎:

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

1
谢谢!我对其他答案无法解决感到非常沮丧。
Michael Wolf

4

另一种选择是:

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

参考:这里


2
$("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");
    })
}

看到这篇文章-将滚动事件绑定到动态DIV?


0

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

然后,您可以使用:

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

显然,将ulId替换为可滚动div的实际ID是什么。

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


2
从ajax页面加载ul时,此代码将不起作用。
ABHILASH SB

yeah live已从最新的jquery版本中删除
。.1.7

如果别人会随着答案的改善而删除自己的不赞成票,或者建议如何进一步改善答案,将不胜感激。
IIIOXIII

0

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

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

我遇到的问题是,我不知道何时将孩子加载到DOM,但我一直每秒检查一次。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.