2012-04-25 13 views
17

Próbuję zapobiec przewijaniu zdarzeń kółka myszy przechwyconych przez element strony.Javascript: Przechwyć zdarzenie kółka myszy i nie przewijaj strony?

Spodziewałem „false” jako ostatni parametr uzyskania oczekiwanego rezultatu, ale za pomocą kółka myszy nad tym „płótnie” element nadal powoduje przewijanie:

this.canvas.addEventListener('mousewheel',function(event){mouseController.wheel(event)}, false); 

poza ten „płótnie” element, zwoju musi się wydarzyć. Wewnątrz musi wywoływać tylko metodę .wheel(). Co robię źle?

Dzięki! J.

Odpowiedz

29

Możesz to zrobić, zwracając false na końcu swojego programu obsługi.

this.canvas.addEventListener('mousewheel',function(event){ 
    mouseController.wheel(event); 
    return false; 
}, false); 
+1

+1: Miałem dokładnie ten sam problem, co "zwrot fałszywy", pracował –

+0

W porządku! Rzeczywiście, to robi. Dzięki :-) – Jem

+0

Uważam za dziwne, że false oznacza, że ​​zdarzenie jest obsługiwane. Prawda byłaby bardziej logiczna ... –

19

Czy próbowałeś już event.preventDefault()?

this.canvas.addEventListener('mousewheel',function(event){ 
    mouseController.wheel(event); 
    event.preventDefault(); 
}, false); 
+0

Tak, jak funkcja (event) {event.preventDefault(); mouseController.wheel (event)} – Jem

+0

Ahh, zapomniałem zwrócić false. Dziękuję za Twój czas! – Jem

1

Tego rodzaju anulowanie wydaje się być ignorowane w nowszych wersjach przeglądarki Chrome> 18 (a także w innych przeglądarkach opartych na WebKit). Aby wyłącznie uchwycić zdarzenie, należy bezpośrednio zmienić metodę elementu.

this.canvas.onmousewheel = function(ev){ 
    //perform your own Event dispatching here 
    return false; 
}; 
2

Wystarczy dodać, wiem, że płótno jest tylko HTML5, więc to nie jest potrzebne, ale tylko w przypadku, gdy ktoś chce crossbrowser/oldbrowser zgodność, użyj tego:

/* To attach the event: */ 
addEvent(el, ev, func) { 
    if (el.addEventListener) { 
     el.addEventListener(ev, func, false); 
    } else if (el.attachEvent) { 
     el.attachEvent("on" + ev, func); 
    } else { 
     el["on"+ev] = func; // Note that this line does not stack events. You must write you own stacker if you don't want overwrite the last event added of the same type. Btw, if you are going to have only one function for each event this is perfectly fine. 
    } 
} 

/* To prevent the event: */ 
addEvent(this.canvas, "mousewheel", function(event) { 
    if (!event) event = window.event; 
    event.returnValue = false; 
    if (event.preventDefault)event.preventDefault(); 
    return false; 
}); 
Powiązane problemy