2009-09-28 24 views
9

he notado un comportamiento extraño de la función live() en jQuery:jQuery en vivo ('clic') de disparo para haga clic con

<a href="#" id="normal">normal</a> 
<a href="#" id="live">live</a> 

$('#normal').click(clickHandler); 
$('#live').live('click', clickHandler); 

function clickHandler() { 
    alert("Clicked"); 
    return false; 
} 

Eso es fino y elegante hasta que haga clic en el "en vivo" enlace y dispara el controlador, y luego no muestra el menú contextual. El controlador de eventos no se dispara en absoluto (como se esperaba) en el enlace "normal".

he sido capaz de evitar que al cambiar el controlador a esto:

function clickHandler(e) { 
    if (e.button != 0) return true; 
    // normal handler code here 
    return false; 
} 

Pero eso es muy molesto tener que añadir que a todos los controladores de eventos. ¿Hay alguna manera mejor de que los controladores de eventos solo se activen como los manejadores de clics normales?

+1

¿Cómo se hace una pregunta en el futuro? – PetersenDidIt

+0

Me entusiasmó ver su solución aquí, y probé esto rápidamente en mi propia aplicación, y aunque los enlaces en los que hago clic derecho ahora pueden ser capturados e ignorados, todavía no veo mi menú contextual en el botón derecho estas. Además, el clic de mi botón central del ratón (abrir en una nueva pestaña) tampoco funciona. ¡Pero, al menos el manejador puede regresar temprano! – Funka

+0

En realidad, parece que si hago clic con el botón secundario en varias ocasiones, rápidamente, ocasionalmente puedo ver el menú contextual ... Hmmm. – Funka

Respuesta

9

Es un known issue:

Parece que Firefox no se dispara un evento click para el elemento en una botón derecho del ratón, aunque se dispara un mousedown y mouseup. Sin embargo, hace activa un evento de clic en document! Como .live capta los eventos en el nivel del documento, ve el evento click para el elemento incluso aunque el elemento no lo hace. Si utiliza un evento como mouseup, el elemento p y document verá el evento.

Su solución alternativa es lo mejor que puede hacer por ahora. Parece que solo afecta a Firefox (creo que en realidad es un error en Firefox, no jQuery per se).

Véase también this question pedido ayer.

0

Esto es una consecuencia desafortunada de cómo se implementa live. En realidad, utiliza el evento de burbujeo para que no esté vinculado al evento de clic del elemento de anclaje, ya que está vinculado al evento de clic del documento.

+0

No, hay un error en la forma en que Firefox hace clic derecho. Consulte http://unixpapa.com/js/mouse.html –

+0

@crescentfresh: No estoy seguro de la cantidad de fe que debe colocar en un artículo que dice "Las versiones de Safari de Macintosh, por supuesto, son inmunes a estos problemas, porque Macintosh solo tiene un botón del mouse "- la última vez que usé una Mac con un solo botón fue en algún momento antes de que TBL inventara la Web ;-) – NickFitz

+0

@NickFitz: touché. –

4

He encontrado una solución - "corregir" el código live().

En la fuente no estructurada de jQuery 1.3.2 alrededor de la línea 2989 hay una función llamada liveHandler(). Modifique el código para agregar una línea:

2989: function liveHandler(event) { 
2990:  if (event.type == 'click' && event.button != 0) return true; 

Esto evitará que los eventos de clic se activen excepto con el botón izquierdo del mouse. Si lo deseaba en particular, podría modificar el código bastante fácilmente para permitir eventos "rightclick" también, pero esto funciona para mí, así que sigue así.

3

En realidad se puede reescribir como:

function reattachEvents(){ 
    $(element).unbind('click').click(function(){ 
     //do something 
    }); 
} 

y llamarlo cuando se agrega un nuevo elemento DOM, que debe tener el resultado esperado (sin cocción en el evento de clic derecho).

+1

sí, pero eso frustra el propósito de 'live()' ¿no es así? – nickf

+0

cierto, pero en vivo (clic) actúa de manera diferente al clic normal() que puede ser reparado si detecta qué botón presionó, pero luego necesita saber exactamente qué navegador fue utilizado (IE actúa de manera diferente en versiones anteriores que en versiones más recientes y todas otros navegadores actúan de la manera "correcta"). Esta es una solución mucho más elegante por el momento. – SeanJA

0

Lo resolví utilizando eventos de mousedown. En mi situación, la distinción entre mousedown y clic no importaba.

Cuestiones relacionadas