2011-08-17 8 views
11

que se unen a un enlace (mediante la función de jQuery .live()) click evento y luego añadir manualmente un controlador onclick evento con JS y HTML puro (como <a href="".... onclick="some action">). Quiero evitar el burbujeo del evento al método live, pero no sé cómo.stopPropagation sin jQuery

Tal e.stopPropagation() es útil en esta situación, pero el controlador de eventos añaden con onclick está escrito en JS puros y no puedo llamar stopPropagation() desde fuera del elemento de envoltura de jQuery. return false en esta situación no funciona. Traté de sustituir return false con $.Event('click').stopPropagation() pero creo que esto está mal ya que no funcionó.

Cómo evitar bubling a live() método sin jQuery envoltura?

Respuesta

2

Con .live, no puede detener la propagación. Esto se debe a que con .live, el controlador de eventos está vinculado a la raíz del árbol DOM. Por lo tanto, el evento debe burbujear hasta el elemento más alto antes de que pueda llamarse a su controlador. Es una de las advertencias sobre el uso de .live.

Considere usar .delegate (si desea que el controlador persista) o use .bind en su lugar.

Si desea que el controlador vivo que se desactive completamente, utiliza la matriz:

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

Demo 1: JsFiddle 1

O agregar un controlador de línea (y cancelar el evento de allí):

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

Demo 2: JsFiddle 2

Inline handlers will b e llamado primero siempre antes de cualquier manejador de eventos jquery.

+0

No puedo cambiar el código que une .live. No hay forma de arreglar esto? – abonec

+0

Pero es posible detener el evento desde otro controlador de eventos vinculado al elemento. –

+0

Solo si ese controlador de eventos está registrado primero. jQuery los pondrá en cola, ¿verdad? – Mrchief

13

estaba bajo el supuesto de que return false en manejadores de eventos "normales" impide el caso de burbujeo, así, but I was wrong (gracias @Mrchief).

hay otras maneras para detenerlo, aunque, como se describe en la quirksmode.org:

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

cancelBubble es para IE, stopPropagation obras en todos los navegadores compatibles W3C.

+0

¡Incluso lo aprendí hace unas semanas! – Mrchief

+0

Cuando intento obtener información sobre el evento (onclick "alert (window.event)") me muestra una alerta "indefinida" cuando hago clic. – abonec

+1

@Abonec: 'window.event' solo está disponible en IE (y Chrome). En otros navegadores, el objeto de evento se pasa al controlador de eventos como parámetro. –