Jeśli rozumiem Twojego problemu poprawnie, widzisz ogień zdarzeń zbyt często. Problem polega na tym, że w przypadku każdej danej czynności przewijania zdarzenie uruchamia się kilka razy. Możesz to zobaczyć, jeśli otworzysz konsolę programisty w przeglądarce i wykonasz numer console.log(e.originalEvent.wheelDelta)
. Może to spowodować złamanie dużego zwoju w kilku małych wydarzeniach przewijania, odrzucając pożądane zachowanie. Sposób, w jaki traktowane to było użyć zmiennej trzymać deltę przewijania:
$(document).ready(function(){
var scrollPixels = 0; // variable to store scroll delta
$('body').bind('mousewheel', function(e){
// increment/decrement scroll delta
scrollPixels += e.originalEvent.wheelDelta;
console.log(scrollPixels);
if (scrollPixels < -20) {
scrollPixels = 0; // clear scroll delta
alert('Coming down!');
}
else if (scrollPixels > 20){
scrollPixels = 0; // clear scroll delta
alert('Coming up!');
}
});
});
Następnie można usunąć deltę przewijania po górę lub w dół alarmowych pożarów.
JS Fiddle
Można też zwiększyć próbę ponad 20 pikseli, jak większość przewija zadziała to wydarzenie - 20 pikseli wynosi tylko około 1/4 cala.
Nadzieję, że pomaga. Jeśli to nie rozwiąże problemu, możesz skomentować, gdzie popełniłem błąd. Powodzenia!
Aktualizacja adresu komentarza:
Można czekać, aż przewijania zatrzymuje się przez ustawienie limitu czasu, które będą czekać krótki czas (250 ms w tym przykładzie) po przewinięciu przestał wykonywania. Przeniosłem logiki wewnątrz tego limitu czasu tak, że będzie ona działać dopiero po zatrzymaniu przewijania:
$(document).ready(function(){
var scrollPixels = 0; // variable to store scroll delta
var scrolling; // timeout function var
$('body').bind('mousewheel', function(e){
// increment/decrement scroll delta
scrollPixels += e.originalEvent.wheelDelta;
console.log(scrollPixels);
clearTimeout(scrolling);
scrolling = setTimeout(function() {
console.log('stop wheeling! ', scrollPixels);
scrolling = undefined;
if (scrollPixels < -300) {
scrollPixels = 0; // clear scroll delta
alert('Coming down!');
}
else if (scrollPixels > 300){
scrollPixels = 0; // clear scroll delta
alert('Coming up!');
}
}, 250);
});
});
Updated JS Fiddle
Hej, dziękuję za poświęcony czas! Jest to zbliżone do tego, czego szukam. Podniosłem wartość i zapisałem ją w var (http://jsfiddle.net/marianrick/t7y3aLfh/3/). Jak tylko przewijam bardzo szybko (raz), otrzymuję alert dla każdego "300px". Czy istnieje możliwość wystrzelenia go tylko raz (nawet jeśli miało miejsce przewijanie o wartości 2000 pikseli), do momentu zakończenia zdarzenia przewijania? (Możesz sprawdzić stronę na żywo tutaj: http://img.hiamovi-client.com - chcę przewinąć tylko jeden slajd na przewijanie) –
Cześć Marian, cieszę się, że mogę pomóc. Dodałem drugi blok kodu i skrzypiec, który powinien adresować twój komentarz. Jeśli to pomoże, to daj mi znać! – grdevphl
Wielkie dzięki za te poprawki! '250' jest dość zauważalnym opóźnieniem podczas korzystania z witryny. Ustawienie go na "50" już działa jak urok. –