Se ho ben capito il problema in modo corretto, si sta vedendo il fuoco gli eventi troppo spesso. Il problema qui è che per qualsiasi azione di scorrimento, l'evento viene attivato più volte. Puoi vedere questo se apri la console per sviluppatori nel tuo browser e fai un console.log(e.originalEvent.wheelDelta)
. Questo può interrompere una grande scroll in diversi piccoli eventi di scroll, eliminando il comportamento desiderato. Il modo in cui ho trattato questo è stato quello di utilizzare una variabile per contenere il delta di scorrimento:
$(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!');
}
});
});
È possibile quindi cancellare il delta di scorrimento dopo l'alto o verso il basso incendi di allarme.
JS Fiddle
Si consiglia inoltre di aumentare il test a più di 20 pixel, come la maggior parte delle pergamene spareranno questo evento - 20 pixel è solo circa 1/4 di pollice.
Spero che questo aiuti. Se ciò non risolve il problema, non esitare a commentare dove ho sbagliato. Buona fortuna!
aggiornamento per risolvere commento:
È possibile attendere che il rotolo si ferma impostando un timeout che attendere un breve lasso di tempo (250 ms in questo esempio), dopo lo scorrimento si è interrotto l'esecuzione. Ho spostato la logica all'interno di questo timeout in modo che venga eseguito solo dopo che lo scorrimento si è fermato:
$(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);
});
});
Aggiornato JS Fiddle
Ehi, grazie mille per il vostro tempo! Questo è vicino a quello che sto cercando. Ho aumentato il valore e l'ho memorizzato in una var (http://jsfiddle.net/marianrick/t7y3aLfh/3/). Non appena faccio scorrere molto velocemente (una volta), ottengo questo avviso per ogni '300px'. C'è la possibilità di attivarlo solo una volta (anche se ci sono stati 2000 px di scorrimento), fino a quando l'evento di scorrimento non è terminato? (Puoi controllare il sito live qui: http://img.hiamovi-client.com - Voglio solo scorrere in basso di una diapositiva sullo scrolling) –
Ciao Marian, felice di poterti aiutare. Ho aggiunto un secondo blocco di codice e violino che dovrebbe riguardare il tuo commento. Fammi sapere se questo aiuta! – grdevphl
Grazie mille per questo tweak! '250' è piuttosto un ritardo notevole durante l'utilizzo del sito. Impostarlo su "50" funziona già come un incantesimo. –