2013-06-14 12 views
5

ho capito il modo corretto di gestire event.stopPropagation per IE èPrototipo event.stopPropagation per IE> = 8

if(event.stopPropagation) { 
    event.stopPropagation(); 
} else { 
    event.returnValue = false; 
} 

Ma è possibile al prototipo evento in modo che io non devo fare il check ogni volta che uso stopPropagation?

Questa domanda sembrava utile: JavaScript Event prototype in IE8 tuttavia non capisco perfettamente la risposta accettata e come sia un prototipo che può essere essenzialmente impostato e dimenticato.

risposta

6

Se stai facendo la propria gestione in javascript pianura evento, allora probabilmente hai già una routine cross browser per impostare i gestori di eventi. Puoi mettere l'astrazione in quella funzione. Ecco quello che uso che imita la funzionalità di jQuery (se il gestore di eventi ritorna false, allora sia stopPropagation() e preventDefault() vengono attivati ​​È possibile, ovviamente, modificarlo tuttavia si desidera comportarsi:.

// refined add event cross browser 
function addEvent(elem, event, fn) { 
    // allow the passing of an element id string instead of the DOM elem 
    if (typeof elem === "string") { 
     elem = document.getElementById(elem); 
    } 

    function listenHandler(e) { 
     var ret = fn.apply(this, arguments); 
     if (ret === false) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     } 
     return(ret); 
    } 

    function attachHandler() { 
     // normalize the target of the event 
     window.event.target = window.event.srcElement; 
     // make sure the event is passed to the fn also so that works the same too 
     // set the this pointer same as addEventListener when fn is called 
     var ret = fn.call(elem, window.event); 
     // support an optional return false to be cancel propagation and prevent default handling 
     // like jQuery does 
     if (ret === false) { 
      window.event.returnValue = false; 
      window.event.cancelBubble = true; 
     } 
     return(ret); 
    } 

    if (elem.addEventListener) { 
     elem.addEventListener(event, listenHandler, false); 
    } else { 
     elem.attachEvent("on" + event, attachHandler); 
    } 
} 

Oppure, si può semplicemente fare una funzione di utilità come questo:

function stopPropagation(e) { 
    if(e.stopPropagation) { 
     e.stopPropagation(); 
    } else { 
     e.returnValue = false; 
    }  
} 

E basta chiamare quella funzione invece di operare sull'evento in ogni funzione

+0

Solo così sono chiaro ... quando si usa fn.call non sta effettivamente attivando la funzione che è stata passata nel gestore di eventi? Non sono sicuro di capire come o perché restituirebbe falso? Cosa succede se il gestore eventi non utilizza event.stopPropagation? – ryandlf

+0

E ancora una cosa. Non ho mai visto le parentesi usate per il ritorno. Per curiosità, è diverso dal return ret? – ryandlf

+0

@ryandlf - yes fn.call chiama la funzione di gestione eventi personalizzata (quella che è stata passata con 'addEvent()' per installare il gestore eventi. Se si desidera 'stopPropagation()' di un evento particolare, allora si 'return false' nella funzione del gestore di eventi Se no, non lo è. È compito della funzione di gestione degli eventi decidere se desidera interrompere la propagazione o meno.Questo è il modello utilizzato da jQuery. – jfriend00

7

Probabilmente questo:

Event = Event || window.Event; 
Event.prototype.stopPropagation = Event.prototype.stopPropagation || function() { 
    this.cancelBubble = true; 
} 

returnValue = false è un analogo per preventDefault:

Event.prototype.preventDefault = Event.prototype.preventDefault || function() { 
    this.returnValue = false; 
} 
+0

Nell'altra domanda ho postato un collegamento al poster che cita questo metodo ma ha accettato una risposta diversa. Lui lo menziona non funziona tramite jsFiddle. Questo è il motivo per cui mi sono interessato a questo metodo ... – ryandlf

-1

possiamo usare questo da solo:. event.cancelBubble = true.

Testati funzionano in tutti i browser.