2012-01-16 4 views
33

라이트 박스가 열리면 내 페이지에서 스크롤을 사용하지 않으려 고합니다. 정확히이 스크립트를 사용하면 매우 유용합니다. (http://jsfiddle.net/mrtsherman/eXQf3/3/), 안타깝게도, 내 자신의 페이지에서 사용할 때, 라이트 박스에서 스크롤을 사용할 수 없게됩니다. 나는 경고가있는 코드를 디버깅하기 시작하여 event.wheelDelta는 내 페이지에서 "정의되지 않음"을 반환하고 JSFiddle에서는 -120을 반환한다는 것을 알기 시작했습니다.event.wheelDelta는 정의되지 않은 값을 반환합니다.

+0

은. 당신은 몇 가지 코드를 표시하거나 바로 확인 할 수 당신의 이름과 이드가 다시있을 것입니다. 대답은 아마도 거기에있을 것입니다. – SpYk3HH

답변

55

JQuery와 이벤트 핸들러의 event 객체는 실제 사건을 반영하지 않습니다. wheelDelta은 비표준 이벤트 속성 IE와 Opera이며 jQuery 이벤트의 originalEvent 속성을 통해 사용할 수 있습니다. 의 jQuery 1.7+에서

detail 속성은 jQuery를 이벤트 객체에서 사용할 수 없습니다. 따라서 DOMMouseScroll 이벤트에서이 속성으로 event.originalEvent.detail을 사용해야합니다. 이 방법은 이전 jQuery 버전과 역 호환됩니다.

event.originalEvent.wheelDelta 

데모 : 또한 http://jsfiddle.net/eXQf3/22/
참조 : http://api.jquery.com/category/events/event-object/

+0

고마워요, 효과가있었습니다! – CupOfTea696

+2

당신은 천재입니다! 나는 다른 많은 해결책을 보았습니다. 그리고 당신의 바이올린은 근본적으로 뿌리 내리고 실제로 –

+0

많은 시간을 절약 해 주셔서 감사합니다. – suvajit

12
$.fn.wheel = function (callback) { 
    return this.each(function() { 
     $(this).on('mousewheel DOMMouseScroll', function (e) { 
      e.delta = null; 
      if (e.originalEvent) { 
       if (e.originalEvent.wheelDelta) e.delta = e.originalEvent.wheelDelta/-40; 
       if (e.originalEvent.deltaY) e.delta = e.originalEvent.deltaY; 
       if (e.originalEvent.detail) e.delta = e.originalEvent.detail; 
      } 

      if (typeof callback == 'function') { 
       callback.call(this, e); 
      } 
     }); 
    }); 
}; 

과 같이 사용 JQuery와-된 fying 기능에 대한 @ 마크하는

$('body').wheel(function (e) { 
    e.preventDefault(); 
    $('#myDiv').append($('<div>').text(e.delta)); 
}); 

큰 THX (:

+1

최신 Firefox에서는 작동하지 않습니다. 델타가 여기에 자리 잡고 있음을 발견했습니다.'if (e.originalEven t && e.originalEvent.deltaY) 반환 e.originalEvent.deltaY * -40' @ 마크가 고정 – mpen

+0

, 나는이 크로스 브라우저 물건 –

+1

그래 싫어, JQuery와에 의해 어떤 종류의 보편적 인 델타가 있었으면 좋겠어 .. 지금은 작동합니다, 왜 이것이 jQuery 코어에 포함되지 않을지 확신하지 못합니다. 나는 그것에서 기능을 만들었 : http://jsfiddle.net/mnbayazit/uTbGp/3/ FF와 크롬에서 작동, 아직 IE8에서 작동하지 않아. – mpen

1

해결책을 시도했습니다. psycho brm, 나는 Firefox에서 작동하도록 extractDelta(e) 함수를 변경했습니다. e.detail 대신 e.originalEvent.detail을 사용했습니다. Firefox가 정의되지 않은 델타를 반환했기 때문입니다. 이 post에 솔루션과 테스트 코드를 업로드했습니다. 나는 그것이 도움이되기를 바랍니다. 웹킷과 FF의

function extractDelta(e) { 
    if (e.wheelDelta) { 
     return e.wheelDelta; 
    } 

    if (e.originalEvent.detail) { 
     return e.originalEvent.detail * -40; 
    } 

    if (e.originalEvent && e.originalEvent.wheelDelta) { 
     return e.originalEvent.wheelDelta; 
    } 
} 
+0

"세부 사항"은 최신 Firefox에 존재하지 않는 것으로 보입니다. 현재 델타 X, Y, Z로 나눠져있는 것 같습니다. – mpen

+1

안녕하세요. Mac에서 Firefox 27.0.1에서이 코드를 테스트 한 결과 마우스 휠에서 반환 한 이벤트를 확인했습니다. 그것은 여전히 ​​내부, "originalEvent"요소를 포함하며 내부에 "detail"요소를 찾을 수 있습니다. 나는 그것을 가치를 확인하고 여전히 작동합니다. 휠을 앞뒤로 움직이면 기호가 바뀌고 휠의 속도에 따라 값이 변경됩니다.정상적인 값을 얻었습니다 : 1, -1, 2, -1, -4, 1 ... 정확히 어디에서 문제를 발견했는지 모르겠습니다. – Timbergus

4
$(this).on('mousewheel DOMMouseScroll', function(e){ 

    var dat = $(e.delegateTarget).data(); //in case you have set some, read it here. 
    var datx = dat.x || 0; // just to show how to get specific out of jq-data object 

    var eo = e.originalEvent; 
    var xy = eo.wheelDelta || -eo.detail; //shortest possible code 
    var x = eo.wheelDeltaX || (eo.axis==1?xy:0); 
    var y = eo.wheelDeltaY || (eo.axis==2?xy:0); //() necessary! 
    console.log(x,y); 

}); 

작품, 수 여기에없는 증거 IE :(나는 비슷한 문제를 했어 그것은 DOM 네임 스페이스 지정에 내려와

관련 문제