jQuery에서 마우스 휠 이벤트를 받으시겠습니까?


130

scrolljQuery에서 마우스 휠 이벤트 ( 이벤트 에 대해 이야기하지 않음)를 얻는 방법이 있습니까?


1
빠른 검색 으로이 플러그인 이 도움이되었습니다.
Jerad Rose

이 솔루션은 나를 위해 작동합니다 : stackoverflow.com/questions/7154967/jquery-detect-scrolldown
bertie

@thejh는 DOM3 이벤트로 이것에 대한 새로운 답변을 올렸습니다 : stackoverflow.com/a/24707712/2256325
Sergio


이것에 대한 메모. 입력 변경 사항 만 감지하고 마우스 휠을 통해 변경 사항을 감지하지 못하는 경우$(el).on('input', ...
rybo111

답변:



201
$(document).ready(function(){
    $('#foo').bind('mousewheel', function(e){
        if(e.originalEvent.wheelDelta /120 > 0) {
            console.log('scrolling up !');
        }
        else{
            console.log('scrolling down !');
        }
    });
});

51
DOMMouseScroll둘 다에서 수신하기에 그래서 이벤트는, FF에 사용되는 .bind('DOMMouseScroll mousewheel') {evetns developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/...
mrzmyr을

9
e.originalEvent.wheelDeltaFF23에서 정의되지 않음
hofnarwillie

26
120으로 나눌 필요가 없습니다. 그것은 쓸모없는 CPU 낭비입니다
venimus

6
최고의 답변이어야합니다

2
어쨌든, 왜 그것을 120으로 나누고 싶습니까? 그 상수는 무엇입니까? (venimus가 지적했듯이 필요하지 않습니다.)
mshthn

145

둘 다에 바인딩 mousewheel하고 DOMMouseScroll결국 나를 위해 잘 작동했습니다.

$(window).bind('mousewheel DOMMouseScroll', function(event){
    if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) {
        // scroll up
    }
    else {
        // scroll down
    }
});

이 방법은 IE9 +, Chrome 33 및 Firefox 27에서 작동합니다.


편집-2016 년 3 월

이 문제는 오랜 시간이 지났으므로 다시 방문하기로 결정했습니다. 스크롤 이벤트에 대한 MDN 페이지에는를 사용하는 스크롤 위치를 검색하는 좋은 방법이 있습니다 requestAnimationFrame. 스크롤 방향 및 위치 외에도 더 나은 호환성을 제공하기 위해 코드를 수정했습니다.

(function() {
  var supportOffset = window.pageYOffset !== undefined,
    lastKnownPos = 0,
    ticking = false,
    scrollDir,
    currYPos;

  function doSomething(scrollPos, scrollDir) {
    // Your code goes here...
    console.log('scroll pos: ' + scrollPos + ' | scroll dir: ' + scrollDir);
  }

  window.addEventListener('wheel', function(e) {
    currYPos = supportOffset ? window.pageYOffset : document.body.scrollTop;
    scrollDir = lastKnownPos > currYPos ? 'up' : 'down';
    lastKnownPos = currYPos;

    if (!ticking) {
      window.requestAnimationFrame(function() {
        doSomething(lastKnownPos, scrollDir);
        ticking = false;
      });
    }
    ticking = true;
  });
})();

Jesse Dupuy ( @ blindside85 의 펜 바닐라 JS 스크롤 추적 참조)CodePen의 )가 .

이 코드는 현재 작동하고 있습니다 Chrome v50, Firefox v44, Safari v9, and IE9+

참고 문헌 :


이것은 나를 위해 최선을 다했습니다. 그러나이 스크립트는 스크롤 휠의 "클릭"마다 실행됩니다. 일부 스크립트는 사용하기가 너무 어려울 수 있습니다. 스크롤 휠 클릭당 스크립트를 실행하는 대신 각 스크롤 이벤트를 하나의 인스턴스로 처리하는 방법이 있습니까?
invot in

특별히 그렇지 않습니다. 내가 본 것에서 많은 사람들이 스크롤 추적을 처리하지 않거나 대신 타이머를 사용합니다 (예 : x 밀리 초마다 페이지에서 사용자의 위치 확인 등). 더 강력한 솔루션이 있다면 분명히 알고 싶습니다!
Jesse Dupuy

1
이 작업을 수행하는 방법을 찾았습니다. stackoverflow.com/questions/23919035/…
invot at

1
업데이트 해 주셔서 감사합니다. 코드를 답변에 복사 할 수 있습니까? 언젠가 코드 펜이 다운 될지 모릅니다. 전에 일어난 일입니다.
JDB는 여전히 Monica를 기억합니다.

2
@JesseDupuy, 나는이 답변을 찬성하지만 문서가보기 ( "너비 : 100vh; 높이 : 100vh")에 맞거나 "오버플로 : 숨겨진;"이있는 경우 업데이트 된 버전이 작동하지 않습니다. "window.addEventListener ( 'scroll', callback)"은 "window.addEventListener ( 'mousewheel', callback)"에 대한 정답이 아닙니다.
Daniel

45

2017 년 현재, 당신은 단지 쓸 수 있습니다

$(window).on('wheel', function(event){

  // deltaY obviously records vertical scroll, deltaX and deltaZ exist too
  if(event.originalEvent.deltaY < 0){
    // wheeled up
  }
  else {
    // wheeled down
  }
});

현재 Firefox 51, Chrome 56, IE9 +에서 작동


37

"마우스 휠"이벤트에 대한 답변은 더 이상 사용되지 않는 이벤트를 나타냅니다. 표준 이벤트는 단순히 "바퀴"입니다. 참조 https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel를


20
나는 이것을 시도하고 발견했다 : "wheel"은 Firefox와 IE에서는 작동하지만 Chrome에서는 작동하지 않습니다. "마우스 휠"은 Chrome 및 IE에서는 작동하지만 Firefox에서는 작동하지 않습니다. "DOMMouseScroll"은 Firefox에서만 작동합니다.
커티스 얄롭

1
우와, 이로 인해 많은 시간이 절약되었습니다. 감사!
gustavohenke

3
2013 년 8 월 Chrome에서 "wheel"에 대한 지원을 추가 한 것 같습니다 : code.google.com/p/chromium/issues/detail?id=227454
rstackhouse

2
Safari는 여전히 휠 이벤트를 지원하지 않습니다.
Thayne

문서에서 알 수 있듯이 wheel이벤트가 동일하지 Edge 않은 이벤트가 지원됩니다 IE. CanIuse
Alex

16

이것은 나를 위해 일했다 :)

 //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;
 });

stackoverflow에서


14

다음은 바닐라 솔루션입니다. 함수에 전달 된 이벤트가 event.originalEventjQuery가 jQuery 이벤트의 속성으로 사용할 수있는 경우 jQuery에서 사용할 수 있습니다. 또는 callback아래 함수 내부에 첫 번째 줄 앞에 추가하십시오.event = event.originalEvent; .

이 코드는 휠 속도 / 양을 정규화하고 일반적인 마우스에서 앞으로 스크롤하는 것에 긍정적이고 뒤로 마우스 휠 이동에서는 부정적입니다.

데모 : http://jsfiddle.net/BXhzD/

var wheel = document.getElementById('wheel');

function report(ammout) {
    wheel.innerHTML = 'wheel ammout: ' + ammout;
}

function callback(event) {
    var normalized;
    if (event.wheelDelta) {
        normalized = (event.wheelDelta % 120 - 0) == -0 ? event.wheelDelta / 120 : event.wheelDelta / 12;
    } else {
        var rawAmmount = event.deltaY ? event.deltaY : event.detail;
        normalized = -(rawAmmount % 3 ? rawAmmount * 10 : rawAmmount / 3);
    }
    report(normalized);
}

var event = 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll';
window.addEventListener(event, callback);

jQuery 용 플러그인도 있습니다.이 코드는 코드와 설탕이 더 장황합니다 : https://github.com/brandonaaron/jquery-mousewheel


8

이것은 각 IE, Firefox 및 Chrome의 최신 버전에서 작동합니다.

$(document).ready(function(){
        $('#whole').bind('DOMMouseScroll mousewheel', function(e){
            if(e.originalEvent.wheelDelta > 0 || e.originalEvent.detail < 0) {
                alert("up");
            }
            else{
                alert("down");
            }
        });
    });

5

오늘이 문제에 갇혀 있었고이 코드가 제대로 작동한다는 것을 알았습니다.

$('#content').on('mousewheel', function(event) {
    //console.log(event.deltaX, event.deltaY, event.deltaFactor);
    if(event.deltaY > 0) {
      console.log('scroll up');
    } else {
      console.log('scroll down');
    }
});

4

이 코드를 사용하십시오

 knob.bind('mousewheel', function(e){  
 if(e.originalEvent.wheelDelta < 0) {
    moveKnob('down');
  } else {
    moveKnob('up');
 }
  return false;
});

0

내 조합은 다음과 같습니다. 스크롤을 내릴 때마다 페이드 아웃됩니다. 그렇지 않으면 헤더를 페이드 인하 기 위해 헤더까지 스크롤해야합니다.

var header = $("#header");
$('#content-container').bind('mousewheel', function(e){
    if(e.originalEvent.wheelDelta > 0) {
        if (header.data('faded')) {
            header.data('faded', 0).stop(true).fadeTo(800, 1);
        }
    }
    else{
        if (!header.data('faded')) header.data('faded', 1).stop(true).fadeTo(800, 0);
    }
});

위의 방법은 터치 / 모바일에 최적화되어 있지 않습니다. 모든 모바일에 더 적합하다고 생각합니다.

var iScrollPos = 0;
var header = $("#header");
$('#content-container').scroll(function () {

    var iCurScrollPos = $(this).scrollTop();
    if (iCurScrollPos > iScrollPos) {
        if (!header.data('faded')) header.data('faded', 1).stop(true).fadeTo(800, 0);

    } else {
        //Scrolling Up
        if (header.data('faded')) {
            header.data('faded', 0).stop(true).fadeTo(800, 1);
        }
    }
    iScrollPos = iCurScrollPos;

});

0

@DarinDimitrov 게시하는 플러그인은 jquery-mousewheel, jQuery를 3+로 분류됩니다 . jquery-wheeljQuery 3 이상에서 작동하는 것이 더 좋습니다 .

jQuery 경로를 사용하지 않으려는 경우 MDNmousewheel 은 비표준적이고 여러 곳에서 지원되지 않으므로 이벤트사용하는 것이 좋습니다. 대신 정확히 의미하는 값에 대해 훨씬 더 구체적으로할수록 이벤트 를 사용해야wheel 한다고 말합니다 . 대부분의 주요 브라우저에서 지원됩니다.


0

언급 된 jquery mousewheel plugin 을 사용하는 경우 이벤트 핸들러 함수의 두 번째 인수를 사용하는 방법은 다음과 delta같습니다.

$('#my-element').on('mousewheel', function(event, delta) {
    if(delta > 0) {
    console.log('scroll up');
    } 
    else {
    console.log('scroll down');
    }
});

-3

최근 $(window).mousewheel에 돌아 오는 곳 에서 같은 문제가 발생했습니다. undefined

내가 한 것은 $(window).on('mousewheel', function() {});

또한 그것을 처리하기 위해 사용하고 있습니다 :

function (event) {
    var direction = null,
        key;

    if (event.type === 'mousewheel') {
        if (yourFunctionForGetMouseWheelDirection(event) > 0) {
            direction = 'up';
        } else {
            direction = 'down';
        }
    }
}

당신은 newUtilities.getMouseWheelDirection 무슨 말을하지 않았다
ccsakuweb

이 질문의 범위를 벗어납니다. 따라서 붙여 넣기 웹 사이트가 아닙니다.
Szymon Toda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.