JQuery'de fare tekerleği etkinlikleri alınsın mı?


130

JQuery'de fare tekerleği olaylarını (olaylardan bahsetmeden scroll) almanın bir yolu var mı ?


1
Hızlı bir arama , yardımcı olabilecek bu eklentiyi buldu .
Jerad Rose


@thejh, DOM3 etkinlikleriyle bu konuya yeni bir yanıt yayınladı: stackoverflow.com/a/24707712/2256325
Sergio


Bununla ilgili bir not. Yalnızca bir girişteki değişiklikleri algılamak istiyorsanız ve fare tekerleği aracılığıyla değişiklikleri $(el).on('input', ...
algılamıyorsa

Yanıtlar:


46

Yukarı / aşağı fare tekerleğini ve bir bölge üzerindeki hızı algılayan bir eklenti var.


35
Eklenti? hadi .. aşağıdaki cevabı kontrol et olmadan yapabilirsin

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
DOMMouseScrollEğer hem dinlemek zorunda olay, FF kullanılır .bind('DOMMouseScroll mousewheel') {evetns developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/...
mrzmyr

9
e.originalEvent.wheelDeltaFF23'te tanımlanmadı
hofnarwillie

26
120'ye bölmenize gerek yok, bu gereksiz cpu
israfıdır

6
en iyi cevap olmalı

2
Her neyse, neden 120'ye bölmek isteyesiniz? Bu sabit nedir? (Venimus'un belirttiği gibi mecbur değilsin.)
mshthn

145

Her ikisine de bağlanmak mousewheelve DOMMouseScrollbenim için gerçekten iyi sonuç verdi:

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

Bu yöntem IE9 +, Chrome 33 ve Firefox 27'de çalışıyor.


Düzenleme - Mart 2016

Bir süredir bu konuyu tekrar gözden geçirmeye karar verdim. Kaydırma olayının MDN sayfası requestAnimationFrame, önceki algılama yöntemime göre oldukça tercih edilen, kullanılan kaydırma konumunu almak için harika bir yoldur . Kaydırma yönü ve konumuna ek olarak daha iyi uyumluluk sağlamak için kodlarını değiştirdim:

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

CodePen'de Jesse Dupuy ( @ blindside85 ) tarafından hazırlanan Pen Vanilla JS Scroll Takibini görün .

Bu kod şu anda çalışıyor Chrome v50, Firefox v44, Safari v9, and IE9+

Referanslar:


Bu benim için en iyisi oldu. Bununla birlikte, bu komut dosyası, kaydırma tekerleğinin "tıklama" başına çalışır. Bu, bazı komut dosyalarının kullanması için çok zor olabilir. Her kaydırma olayını kaydırma tekerleği tıklaması başına komut dosyasını çalıştırmak yerine tek bir örnek olarak ele almanın bir yolu var mı?
2014

Özellikle değil. Gördüğüm kadarıyla, birçok insan ya kaydırma takibiyle uğraşmaktan kaçınır ya da bunun yerine bir zamanlayıcı kullanır (örneğin, her x milisaniyede bir kullanıcının sayfadaki konumunu kontrol edin, vb.). Orada daha performanslı bir çözüm varsa, kesinlikle bunu bilmek istiyorum!
Jesse Dupuy

1
Bunu yapmanın bir yolunu buldum: stackoverflow.com/questions/23919035/…
2014

1
Güncelleme için teşekkürler. Kodunuzu cevabınıza kopyalayabilir misiniz? Codepen'in bir gün düşüp düşmeyeceğini asla bilemezsin. Daha önce oldu.
JDB, Monica'yı

2
@JesseDupuy, bu yanıta olumlu oy verirdim, ancak belge görünüme uyuyorsa ("genişlik: 100vh; yükseklik: 100vh") veya "overflow: hidden;" varsa güncellenmiş sürümünüz çalışmaz. "window.addEventListener ('kaydırma', geri arama)", "window.addEventListener ('fare tekerleği', geri arama)" için doğru yanıt değil.
Daniel

45

2017'den itibaren yazabilirsin

$(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
  }
});

Mevcut Firefox 51, Chrome 56, IE9 + ile çalışır


37

"Fare tekerleği" olayından bahseden yanıtlar, kullanımdan kaldırılmış bir olaya atıfta bulunuyor. Standart olay basitçe "tekerlek" dir. Https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel adresine bakın.


20
Bunları denedim ve buldum: "tekerlek" Firefox ve IE'de çalışıyor ancak Chrome'da çalışmıyor. "fare tekerleği" Chrome ve IE'de çalışır ancak Firefox'ta çalışmaz. "DOMMouseScroll" yalnızca Firefox'ta çalışır.
Curtis Yallop

1
Whoa, bu bana çok zaman kazandırdı. Teşekkürler!
gustavohenke

3
Chrome, Ağustos 2013'te "tekerlek" için destek eklemiş gibi görünüyor: code.google.com/p/chromium/issues/detail?id=227454
rstackhouse

2
Safari hala tekerlek olayını desteklemiyor.
Thayne

Belgelerinizin söylediği gibi wheelolay desteklenir Edge değil IEaynı şey değildir. CanIuse
Alex

16

Bu benim için çalıştı :)

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

yığın taşmasından


14

İşte bir vanilya çözümü. İşleve iletilen event.originalEventolay jQuery'nin jQuery olayının özelliği olarak kullanılabilir hale getirdiği olay ise jQuery'de kullanılabilir. Ya içeride eğer callbackfonksiyonu biz ilk satırdan önce eklemek altında: event = event.originalEvent;.

Bu kod, tekerlek hızını / miktarını normalleştirir ve tipik bir farede ileriye doğru kaydırma için pozitif, geriye doğru fare tekerleği hareketinde negatiftir.

Demo: 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);

Ayrıca jQuery için kodda daha ayrıntılı ve fazladan şeker içeren bir eklenti de var: https://github.com/brandonaaron/jquery-mousewheel


8

Bu, her IE, Firefox ve Chrome'un en son sürümlerinde çalışıyor.

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

5

Bugün bu sayıya takılı kaldım ve bu kodun benim için iyi çalıştığını gördüm

$('#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

bu kodu kullan

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

0

kombinasyonum buna benziyor. her aşağı / yukarı kaydırmada kaybolur ve belirir. aksi takdirde üstbilgiyi karartmak için başlığa yukarı kaydırmanız gerekir.

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

Yukarıdakiler dokunmatik / mobil için optimize edilmemiştir, bunun tüm mobil cihazlar için daha iyi olduğunu düşünüyorum:

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 yayınladığı eklenti, jquery-mousewheel, jQuery 3+ ile bozuldu . jquery-wheelJQuery 3+ ile çalışan hangisinin kullanılması daha tavsiye edilir .

JQuery rotasına gitmek istemiyorsanız, MDN, mousewheelolayı standart olmadığı ve pek çok yerde desteklenmediği için kullanırken son derece uyarıyor . Bunun yerine, aldığınız değerlerin tam olarak ne anlama geldiği konusunda çok daha fazla özgüllük elde ettiğiniz için etkinliği kullanmanız gerektiğiniwheel söylüyor . Çoğu büyük tarayıcı tarafından desteklenir.


0

Sözü kullanılması halinde jQuery Fare tekerleğinin eklenti , o zaman ne olay işleyici işlevinin 2 argüman kullanılacağı hakkında - delta:

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

-3

Geçenlerde aynı sorunu nerede $(window).mousewheeldönüyordumundefined

Ne yaptım $(window).on('mousewheel', function() {});

Daha fazla işlemek için kullanıyorum:

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

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

NewUtilities.getMouseWheelDirection
ccsakuweb

Bu sorunun kapsamı dışında. SO, kopyalayıp yapıştırma web sitesi değil.
Szymon Toda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.