我想在有人向下滚动元素时运行一个函数。像这样:
$('div').scrollDown(function(){ alert('down') });
$('div').scrollUp(function(){ alert('up') });
但这些功能不存在。有这个问题的解决方案吗? They似乎能够做到这一点。不幸的是源代码是压缩的,所以那里没有运气......
谢谢!
答案 0 :(得分:105)
我最终设法弄明白了,所以如果有人在寻找答案:
//Firefox
$('#elem').bind('DOMMouseScroll', function(e){
if(e.originalEvent.detail > 0) {
//scroll down
console.log('Down');
}else {
//scroll up
console.log('Up');
}
//prevent page fom scrolling
return false;
});
//IE, Opera, Safari
$('#elem').bind('mousewheel', function(e){
if(e.originalEvent.wheelDelta < 0) {
//scroll down
console.log('Down');
}else {
//scroll up
console.log('Up');
}
//prevent page fom scrolling
return false;
});
答案 1 :(得分:48)
以下示例将仅侦听MOUSE滚动,无触摸或触控板滚动。
它使用jQuery.on()(从jQuery 1.7开始,.on()方法是将事件处理程序附加到文档的首选方法。)
$('#elem').on( 'DOMMouseScroll mousewheel', function ( event ) {
if( event.originalEvent.detail > 0 || event.originalEvent.wheelDelta < 0 ) { //alternative options for wheelData: wheelDeltaX & wheelDeltaY
//scroll down
console.log('Down');
} else {
//scroll up
console.log('Up');
}
//prevent page fom scrolling
return false;
});
适用于所有浏览器。
答案 2 :(得分:40)
这个值得更新 - 现在我们有wheel
事件:
$(function() {
$(window).on('wheel', function(e) {
var delta = e.originalEvent.deltaY;
if (delta > 0) $('body').text('down');
else $('body').text('up');
return false; // this line is only added so the whole page won't scroll in the demo
});
});
&#13;
body {
font-size: 22px;
text-align: center;
color: white;
background: grey;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
对现代浏览器的支持已经相当长一段时间了:
https://developer.mozilla.org/en-US/docs/Web/Events/wheel
如果需要更深入的浏览器支持,最好使用mousewheel.js而不是搞乱:
https://plugins.jquery.com/mousewheel/
$(function() {
$(window).mousewheel(function(turn, delta) {
if (delta > 0) $('body').text('up');
else $('body').text('down');
return false; // this line is only added so the whole page won't scroll in the demo
});
});
&#13;
body {
font-size: 22px;
text-align: center;
color: white;
background: grey;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js"></script>
&#13;
答案 3 :(得分:22)
此帖子中可能有 3解决方案和other stackoverflow article。
解决方案1
var lastScrollTop = 0;
$(window).on('scroll', function() {
st = $(this).scrollTop();
if(st < lastScrollTop) {
console.log('up 1');
}
else {
console.log('down 1');
}
lastScrollTop = st;
});
解决方案2
$('body').on('DOMMouseScroll', function(e){
if(e.originalEvent.detail < 0) {
console.log('up 2');
}
else {
console.log('down 2');
}
});
解决方案3
$('body').on('mousewheel', function(e){
if(e.originalEvent.wheelDelta > 0) {
console.log('up 3');
}
else {
console.log('down 3');
}
});
我无法在Safari上测试
chrome 42(Win 7)
Firefox 37(Win 7)
IE 11(Win 8)
IE 10(Win 7)
IE 9(Win 7)
IE 8(Win 7)
我检查了IE 11和IE 8的副作用来自
if else
声明。因此,我将其替换为if else if
语句,如下所示。
在多浏览器测试中,我决定对常见浏览器使用 Solution 3 ,对firefox和IE 11使用 Solution 1 。
我提到this answer来检测IE 11。
// Detect IE version
var iev=0;
var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var rv=navigator.userAgent.indexOf("rv:11.0");
if (ieold) iev=new Number(RegExp.$1);
if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
if (trident&&rv!=-1) iev=11;
// Firefox or IE 11
if(typeof InstallTrigger !== 'undefined' || iev == 11) {
var lastScrollTop = 0;
$(window).on('scroll', function() {
st = $(this).scrollTop();
if(st < lastScrollTop) {
console.log('Up');
}
else if(st > lastScrollTop) {
console.log('Down');
}
lastScrollTop = st;
});
}
// Other browsers
else {
$('body').on('mousewheel', function(e){
if(e.originalEvent.wheelDelta > 0) {
console.log('Up');
}
else if(e.originalEvent.wheelDelta < 0) {
console.log('Down');
}
});
}
答案 4 :(得分:9)
$(function(){
var _top = $(window).scrollTop();
var _direction;
$(window).scroll(function(){
var _cur_top = $(window).scrollTop();
if(_top < _cur_top)
{
_direction = 'down';
}
else
{
_direction = 'up';
}
_top = _cur_top;
console.log(_direction);
});
});
答案 5 :(得分:0)
Here is a sample显示了一种简单的方法。脚本是:
$(function() {
var _t = $("#container").scrollTop();
$("#container").scroll(function() {
var _n = $("#container").scrollTop();
if (_n > _t) {
$("#target").text("Down");
} else {
$("#target").text("Up");
}
_t = _n;
});
});
#container
是您的div id
。 #target
只是为了看它的运作。在向上或向下时更改为您想要的内容。
修改强>
OP之前没有说过,但由于他正在使用带有overflow: hidden
的div,因此不会进行滚动,那么检测滚动的脚本就是最少的。那么,如何检测不会发生的事情?!
所以,OP自己发布了他想要的链接,为什么不使用那个库呢? http://cdn.jquerytools.org/1.2.5/full/jquery.tools.min.js
电话只是:
$(function() {
$(".scrollable").scrollable({ vertical: true, mousewheel: true });
});
答案 6 :(得分:0)
var mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel" //FF doesn't recognize mousewheel as of FF3.x
$(document).bind(mousewheelevt,
function(e)
{
var evt = window.event || e //equalize event object
evt = evt.originalEvent ? evt.originalEvent : evt; //convert to originalEvent if possible
var delta = evt.detail ? evt.detail*(-40) : evt.wheelDelta //check for detail first, because it is used by Opera and FF
if(delta > 0)
{
scrollup();
}
else
{
scrolldown();
}
}
);
答案 7 :(得分:0)
您可以使用这个简单的插件将scrollUp
和scrollDown
添加到您的jQuery
https://github.com/phpust/JQueryScrollDetector
var lastScrollTop = 0;
var action = "stopped";
var timeout = 100;
// Scroll end detector:
$.fn.scrollEnd = function(callback, timeout) {
$(this).scroll(function(){
// get current scroll top
var st = $(this).scrollTop();
var $this = $(this);
// fix for page loads
if (lastScrollTop !=0 )
{
// if it's scroll up
if (st < lastScrollTop){
action = "scrollUp";
}
// else if it's scroll down
else if (st > lastScrollTop){
action = "scrollDown";
}
}
// set the current scroll as last scroll top
lastScrollTop = st;
// check if scrollTimeout is set then clear it
if ($this.data('scrollTimeout')) {
clearTimeout($this.data('scrollTimeout'));
}
// wait until timeout done to overwrite scrolls output
$this.data('scrollTimeout', setTimeout(callback,timeout));
});
};
$(window).scrollEnd(function(){
if(action!="stopped"){
//call the event listener attached to obj.
$(document).trigger(action);
}
}, timeout);
答案 8 :(得分:0)
我知道已经有很多好的答案,但是对于那些想要一个简单易用的纯JavaScript解决方案的人来说:
const textarea = document.querySelector('textarea');
const log = document.getElementById('log');
textarea.onscroll = logScroll;
function logScroll(e) {
log.textContent = `Scroll position: ${e.target.scrollTop}`;
}
textarea {
width: 4rem;
height: 8rem;
font-size: 3rem;
}
<textarea>1 2 3 4 5 6 7 8 9</textarea>
<p id="log"></p>