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
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
E ancora una cosa. Non ho mai visto le parentesi usate per il ritorno. Per curiosità, è diverso dal return ret? – ryandlf
@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