9

例如,在使用 AJAX 之后,我将拥有一个可滚动的 DIV。如何将滚动事件绑定到它?

我试过了:

$(window).on("scroll", ".mydiv", function(){...})
$(document).on("scroll", ".mydiv", function(){...})
$(".mydiv").on("scroll", function(){...})
$(".mydiv").scroll(function(){...})

但他们没有工作。

演示

4

9 回答 9

13

我只是在重新提出这个老问题,因为我没有找到好的答案,并且我努力寻找更好的方法来聆听动态附加元素的“滚动”事件。

由于 Scroll 事件不会在 DOM 中冒泡,因此我们不能像使用滚动一样使用 on()。所以我想出了在我想要监听“滚动”事件的元素中监听我自己的自定义触发事件。

在将元素附加到 DOM 之后绑定滚动事件,然后触发我自己的自定义事件。

$("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");
    })
}
body{ font-family: tahoma; font-size: 12px; }
	
	.myDiv{
		height: 90px;
		width: 300px;
		border: 1px solid;
		background-color: lavender;
		overflow: auto;
	}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<input type="button" id="btn" value="Click"/>

于 2015-07-19T06:18:39.867 回答
2

我遇到了同样的问题,我在jQuery .on() API中找到了以下内容:

在所有浏览器中,加载、滚动和错误事件(例如,在元素上)不会冒泡。在 Internet Explorer 8 及更低版本中,粘贴和重置事件不会冒泡。此类事件不支持与委托一起使用,但可以在事件处理程序直接附加到生成事件的元素时使用。

所以不幸的是,这似乎是不可能的。

于 2015-02-28T01:48:37.947 回答
1

试试这个从你的代码修改

http://jsfiddle.net/apDBE/

$(document).ready(function(){

    // Trigger
    $("#btn").click(function(){
        if ($(".myDiv").length == 0) // Append once
        $("body").append('<div class="myDiv"><br><br><p>Content1<p><br><br><p>Content2<p><br><br></div>');
    });

    // Not working
    $(".myDiv").scroll(function(){
        alert("A");
    });

    // Not working
    $(document).on("scroll", ".myDiv", function(){
        alert("A");
    });
});

希望这有帮助

于 2013-05-13T10:07:28.357 回答
0

http://jsfiddle.net/hainawa/cruut/

$(document).ready(function(){
    var $mydiv = $('<div class="myDiv"><br><br><p>Content1<p><br><br><p>Content2<p><br><br></div>');

    // It will work
    $mydiv.scroll(function(){
        alert("A");
    });

    // Trigger
    $("#btn").click(function(){
        //You are using the method append,so you don't need judge if div.mydiv exits.
        //You'll need do this if you're using display:none
        $("body").append($mydiv);
    });
});
于 2013-05-13T10:26:00.560 回答
0

在动态加载的内容上侦听滚动事件的简单方法

<div class="scrollDiv" onscroll="LoadHistory()>
...Your contents to scroll goes here
</div>


</script type="text/javascript">

function LoadHistory(){
var pos = $(".scrollDiv").scrollTop();
if (pos == 0) {
  // your code goes in here
}
}
</script>
于 2019-09-24T16:04:22.490 回答
0

它可以通过直接附加来工作on,请查看下面的示例。

希望这可以帮助。

$("body").append('<div class="myDiv"><br><br><p>Content1<p><br><br><p>Content2<p><br><br></div>');

$(".myDiv").on("scroll", function(){
  	 console.log("scrolling");
});	
	body{ font-family: tahoma; font-size: 12px; }
	
	.myDiv{
		height: 90px;
		width: 300px;
		border: 1px solid;
		background-color: lavender;
		overflow: auto;
	}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

于 2015-12-17T15:41:56.570 回答
0

在我的应用程序中,我有一个按钮,每次单击按钮时都会将表单字段集附加到正文 - 我想将页面向下滚动到新元素,但由于明显的原因(冒泡等),这不起作用。我想出了一个简单的解决方法...

function scroll(pixels){
    $('html, body').animate({
        scrollTop: pixels
    }, 1000);
};

function addObservation(x){
    $('body').append(x);
    newFieldSet = $('fieldset').last();
    pixelsFromTop = newFieldSet.offset().top;
    scroll(pixelsFromTop);
};

$(document).on("click", "#add_observation", function(){
    addObservation("<fieldset>SOME FORM FIELDS HERE</fieldset>");
});

因此,每次添加字段集时,jQuery 都会查找最后添加的字段集,然后.offset().top测量该字段集距顶部的像素数,然后滚动窗口该距离。

于 2016-08-09T19:29:48.837 回答
-1

您应该为您的 div 指定一个高度,溢出等于 auto :

    .myDiv{
    height: 90px;
    overflow: auto;
}
于 2014-04-25T14:20:19.640 回答
-3

在使用 jquey.on() 之前,元素必须存在于文档中。

<div class="mydiv"></div>您可以在使用 jquery.on() 之前插入虚拟对象

$('body').append('<div class="mydiv" style="display:none"></div>');
$(document).on("scroll", ".mydiv", function(){...})
于 2013-05-12T08:04:45.263 回答