2012-01-16 15 views
33

ライトボックスが開いたときにページのスクロールを無効にしようとしていますが、これは本当に便利なスクリプトです。 (http://jsfiddle.net/mrtsherman/eXQf3/3/)、残念なことに、自分のページで使用すると、ライトボックスのスクロールも無効になります。私は警告だけでコードをデバッグし始めました。JSFiddleの中でevent.wheelDeltaは私のページで "undefined"を返すことを知りました。それは-120を返します。event.wheelDeltaは未定義を返します

+0

私は同様の問題を持っていたし、それがダウンし、DOM名前空間になりました。あなたには、いくつかのコード、または単にチェックを示すことができましたあなたの名前とIDはもう一度、あなたのための答えは – 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)return e.originalEvent.deltaY * -40' – mpen

+0

@マークはそれを修正しました。今はうまくいくはずです... jqueryによって何か普遍的なデルタがあったらいいのに、このクロスブラウザのものは嫌いです –

+1

うん、なぜこれがjQueryコアに含まれないのかわかりません。私はそれから機能を作った:http://jsfiddle.net/mnbayazit/uTbGp/3/ FFとクロムで動作し、まだIE8で動作するようにはなっていない。 – mpen

1

解決策を試しました。psycho brm、私はFirefoxで動作させるために、関数extractDelta(e)を変更しました。 e.detailの代わりにe.originalEvent.detailを使用しました。Firefoxが未定義のデルタを返したからです。私はこのpostにソリューションと私のテストコードをアップロードしました。私はそれが助けて欲しいここでのWebkitと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には存在していません。これは今deltaX、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 :(

関連する問題