#javascript #mouse_event
Имеется следующая функция прокрутки вверх страницы(натив JS, и ничего более). preventDefault();
- здесь работает хорошо, но только с одной стороны - предотвращает лишний тик колеса
мыши, прокрутка останавливается в том месте где нужно. Но! Дальнейшие использование
колесика соответственно также предотвращается. Можно не использовать preventDefault();
но тогда возникает лишний шаг прокрутки в зависимости от того в какую сторону крутанули
колесо. (вероятно можно бороться с этим неудобством вычисляя в какую сторону прокрутили
колесо, и добавлять обратную прокрутку scrollBy(); высчитав при этом шаг прокрутки
для каждого браузера). Но задачу хотелось бы максимально упростить, а именно: после
движения колеса мыши предотвратить лишний шаг с помощью preventDefault(), после чего
возобновить нормальное использование прокрутки колесиком мыши. Интернет выдает что-то
из jquery: bind, unbind и прочее - нужен только JS.
var buttonUp = document.getElementById("up");
buttonUp.addEventListener("click", scroll);
function scroll(){
var x = window.pageXOffset, y = window.pageYOffset;
var duration=1000;
var start = new Date;
var timer=setInterval(frame,10);
window.addEventListener("mousewheel", st);
function st(e){
e.preventDefault();
clearInterval(timer);
}
function frame(){
var progress = (new Date - start)/duration;
var y1 = (1-progress) * y;
window.scrollTo(x,y1);
if (progress > 1) {progress = 1;}
if(progress == 1){
clearInterval(timer);
}
}
}
Ответы
Ответ 1
Все оказалось проще чем я думал. Путем мысленного эксперимента вспомнил про removeEventListener(); Последней строчкой функции отсановки таймера нужно было удалить обработчик, выглядит так: function st(e){ e.preventDefault(); clearInterval(timer); window.removeEventListener("mousewheel", st); //<------------------ } Может кому-то поможет в поисках по интернетам:)
Комментариев нет:
Отправить комментарий