2011-11-18 12 views
10

Tengo un elemento <button> dentro del cual tengo 2 elementos <span>. Tengo 2 manejadores de eventos de clic de jquery adjuntos para cada uno de los elementos de tramo, así puedo hacer lo que quiera por cada clic. He aquí un vistazo rápido del código básico:jQuery evento burbujeo en el botón no funciona como se esperaba en Firefox

HTML

<button> 
    <span>Text1</span> 
    <span>Text2</span> 
</button> 

Javascript

$(function() { 
    $('button').bind('click', function() { 
     console.log('button clicked'); 
    }); 
    $('button > span:eq(0)').bind('click', function() { 
     console.log('text1 span clicked'); 
    }); 
    $('button > span:eq(1)').bind('click', function() { 
     console.log('text2 span clicked'); 
    }); 
}); 

Esto es todo funciona bien en Chrome y el evento click se captura en el orden correcto : primero en cualquiera de los elementos de intervalo y luego el evento burbujea hasta el elemento de botón principal.

El problema es que en Firefox el evento de clic no se activa para ninguno de los elementos de intervalo, solo el controlador de eventos de botón registra el evento como disparado.

Aquí es un violín para que pueda ver lo que quiero decir: http://jsfiddle.net/spider/RGL7a/2/

Gracias

+0

Supongo que esto nunca se resolvió? – Shane

+0

@Shane Lamentablemente, no y por lo que he visto nunca podría ser, ya que aún no funciona en la última versión de Firefox. Los marcos como Bootstrap hacen esto usando [dos botones separados] (http://getbootstrap.com/components/#btn-dropdowns-split). Y otros frameworks como Foundation o YUI solo usan otro marcado para simular esta funcionalidad de ** botón dividido ** ([Foundation Example] (http://foundation.zurb.com/docs/components/split_buttons.html) y [YUI Example ] (http://yuilibrary.com/yui/docs/node-menunav/node-menunav-4.html)). – Bogdan

+0

Normalmente utilizo Boostrap para este tipo de funcionalidad y cuando esa no es una opción, uso su estrategia ya que parece ser la mejor en términos de semántica de marcado. – Bogdan

Respuesta

3

Una solución sencilla sería utilizar un elemento <div> en lugar de un elemento de botón. Ponga el código común que desea disparar en una función y luego ejecute la función cuando se hace clic en cualquiera de los tramos, así como el código único del tramo. Si quería ser más 508. usted podría hacer los tramos en <a> tags (etiquetas o incluso <button>.

Obviamente, que no explica el manejo de eventos FF pero podría ser una manera más rápida para ir.

+0

Gracias Ben por la sugerencia. Sí, lo que estás diciendo es una solución alternativa al problema, que conozco y que funciona. Todavía preferiría (si es posible) usar 'button' en lugar de' div' como elemento principal, porque parece más legible y semánticamente correcto tener un botón con 2 acciones (una primaria y una secundaria), que tener un div con 2 botones adentro. Especialmente dado que mis reglas CSS lo marcan como cualquiera de mis botones regulares (acción simple) simplemente divididos por un separador vertical. Si no encuentro ninguna solución, tendré que hacer este compromiso e ir con divs. Gracias de nuevo – Bogdan

-1

intente cambiar

<button> to <button type="button"> 

Esto debería resolver su problema de buenas a primeras. la razón por la que no trabaja es porque su seguir adelante con la acción predeterminada de un botón, que es someter. es decir bOTÓN tendría que devolver false en el Javascript para que lea su clic. Como si tratara de hacer clic en un enlace con configurando su acción predeterminada para devolver falso.

Si agrega la siguiente línea de código jQuery a su js, esto también debería resolver su problema. Asegúrese de agregar el código antes de su botón> span click bind.

 <script type="text/javascript"> 
     $(function() { 
      $('button').click(function(){ 
       return false 
      }); 
     }); 
    </script>   

Espero que esto ayude.

-D

+0

Gracias por las sugerencias, pero ninguno de ellos resuelve el problema (Intenté 'type =" button "' antes de publicar la pregunta, pero no la incorporé a mi ejemplo porque no hizo ninguna diferencia). El problema parece ser que en Firefox, el evento click solo se captura con el elemento 'button' y no con elementos secundarios. – Bogdan

Cuestiones relacionadas