2013-06-08 14 views
6

Come interrompere la propagazione con il listener di eventi della rotellina del mouse?jquery mousewheel stop propagation

Quando si utilizza la rotellina del mouse sopra l'elemento content l'intero documento scorre troppo

Questo non funziona

content.on('mousewheel', function(e, delta){ 
    content.scrollTop(content.scrollTop() - (40 * delta)); 
    set_bar(); 
    e.stopPropagation(); 
}); 

soluzione

content.on('mousewheel', function(e, delta){ 
    content.scrollTop(content.scrollTop() - (40 * delta)); 
    set_bar(); 
    return false; 
}); 
+1

FANTASTICO! Ho impostato stopPropagation e quindi restituito false. Qualche inconveniente di cui sei a conoscenza, restituendo false? Non ho avuto problemi, ma ricordo vagamente di aver letto degli avvertimenti su questo prima. –

+7

Potrebbe essere utile spostare la soluzione nella risposta e contrassegnarla come risolta. In questo modo non compare nella sezione senza risposta. –

risposta

5

Penso che si sta confondendo stopPropgation e preventDefault .

  • stopPropagation interrompe l'evento dalla bolla della catena di eventi.

  • preventDefault impedisce l'azione predefinita sull'elemento . In questo caso impedirà lo scorrimento, per un evento click su un ancoraggio, per esempio, interromperà il collegamento portandoti all'URL definito nell'attributo href.

  • return false d'altra parte fa entrambe queste cose.

sua una distinzione importante da fare come si potrebbe desiderare di utilizzare bubbling degli eventi per la delega evento prevenendo l'azione predefinita, allo stesso tempo.

vedere questi due posti per maggiori informazioni:

Difference between preventDefault and return false

Difference between preventDefault and stopPropagation

1

La soluzione originale è quasi corretto. Ecco cosa ha funzionato:

$(".myScrollableDiv").on("mousewheel",function(e) { 
     var scrollRate = 100; 
     var $t = $(this); 
     var dy = e.originalEvent.deltaY * scrollRate; 
     $t.scrollTop($t.scrollTop() + dy); 
     e.preventDefault(); 
    }); 

Penso che il motivo principale è che jQuery non ci dà un secondo parametro (delta), ma può essere trovato nella manifestazione stessa. Altrimenti va bene.