2011-08-17 15 views
11

mi legano a un collegamento (utilizzando la funzione .live() di jQuery) click evento e quindi aggiungere manualmente un gestore di onclick evento con JS puri e HTML (come <a href="".... onclick="some action">). Voglio impedire il bubbling dell'evento al metodo live ma non so come.stopPropagation senza jQuery

Forse e.stopPropagation() è utile in questa situazione, ma il gestore di eventi aggiunti con onclick è scritto in JS puri e non posso chiamare stopPropagation() da fuori elemento involucro jQuery. return false in questa situazione non funziona. Ho provato a sostituire return false con $.Event('click').stopPropagation() ma penso che questo sia sbagliato in quanto non ha funzionato.

Come evitare il pasticcio sul metodo live() senza wrapper jQuery?

+0

return false in una funzione jQuery non è la stessa cosa al di fuori di esso: http://stackoverflow.com/questions/1357118/javascript-event-preventdefault-vs-return-false – Mrchief

risposta

2

Con .live, non è possibile interrompere la propagazione. Questo perché con .live, il gestore eventi è associato alla radice dell'albero DOM. Di conseguenza, l'evento deve risalire fino all'elemento più alto prima che il gestore possa essere chiamato. È uno degli avvertimenti sull'uso di .live.

Considerare l'utilizzo di .delegate (se si desidera mantenere il gestore) o utilizzare invece .bind.

Se si desidera che il gestore dal vivo per essere disattivato completamente, utilizzare dado:

$("#myHref").die("click", aClick); // this will remove any existing event handlers 
$("#myHref").click(yourhandler); // add your handler 

Demo 1: JsFiddle 1

Oppure, aggiungere un gestore in linea (e annullare l'evento da lì):

<a href=".." onclick="yourhandler"> 

Demo 2: JsFiddle 2

Gli handler in linea si E chiamato prima sempre prima di qualsiasi gestore di eventi jQuery.

+0

Non riesco a cambiare il codice che si lega a .live. Non c'è modo di risolvere questo problema? – abonec

+0

Ma è possibile interrompere l'evento da un altro gestore di eventi associato all'elemento. –

+0

Solo se il gestore eventi è registrato per primo. jQuery li accoderà, giusto? – Mrchief

13

Ero sotto il presupposto che return false in gestori di eventi "normali" impedisce l'evento di ribollimento, but I was wrong (grazie @Mrchief).

ci sono altri modi per fermarlo, però, come descritto a quirksmode.org:

function doSomething(e) 
{ 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 

cancelBubble è per IE, stopPropagation opere in tutti i browser compatibili W3C.

+0

Anche io ho imparato che qualche settimana fa! – Mrchief

+0

Quando provo ad ottenere qualsiasi informazione sull'evento (onclick "alert (window.event)") mi mostra "undefined" quando clicco. – abonec

+1

@Abonec: 'window.event' è disponibile solo in IE (e Chrome). In altri browser, l'oggetto evento viene passato al gestore di eventi come parametro. –