2011-11-18 8 views
10

Ho un elemento <button> all'interno del quale ho 2 elementi <span>. Ho 2 gestori di eventi click jquery collegati per ciascuno degli elementi span in modo da poter fare quello che mi piace per ogni clic. Ecco un rapido sguardo del codice di base:jQuery evento che bolle sul pulsante non funziona come previsto in 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'); 
    }); 
}); 

Questo è tutto lavorare bene in Chrome e l'evento click viene catturata nell'ordine corretto : prima su uno qualsiasi degli elementi span e quindi l'evento bolle fino all'elemento del pulsante parent.

Il problema è che in Firefox l'evento click non viene attivato per nessuno degli elementi span, solo il gestore eventi pulsante registra l'evento come se fosse stato attivato.

Ecco un violino in modo da poter vedere quello che voglio dire: http://jsfiddle.net/spider/RGL7a/2/

Grazie

+0

Immagino che questo non sia mai stato risolto? – Shane

+0

@Shane Sfortunatamente no e da quello che ho visto potrebbe non esserlo mai, in quanto non funziona ancora nell'ultima versione di Firefox. I framework come Bootstrap lo fanno usando [due pulsanti separati] (http://getboototrap.com/components/#btn-dropdowns-split). E altri framework come Foundation o YUI usano semplicemente altri markup del tutto per simulare questa funzionalità ** split button ** ([Foundation Example] (http://foundation.zurb.com/docs/components/split_buttons.html) e [Esempio YUI ] (http://yuilibrary.com/yui/docs/node-menunav/node-menunav-4.html)). – Bogdan

+0

Di solito uso Boostrap per questo tipo di funzionalità e, laddove non è un'opzione, uso la loro strategia in quanto sembra la migliore in termini di markup semantico. – Bogdan

risposta

3

Una soluzione semplice sarebbe quella di utilizzare un elemento <div> invece di un elemento pulsante. Inserisci il codice comune che vuoi attivare in una funzione, quindi esegui la funzione quando viene fatto clic su uno degli span e sul codice univoco dello span. Se si voleva essere più compatibile con 508 si potrebbe creare il campate in <a> tag (o anche <button> tag.

Ovviamente, che non spiega la gestione degli eventi di FF ma potrebbe essere un modo più veloce per andare.

+0

Grazie Ben per il suggerimento. Sì, quello che stai dicendo è una soluzione alternativa al problema, di cui sono a conoscenza e che funziona. Preferirei comunque (se possibile) usare 'button' invece di' div' come elemento genitore, perché sembra più leggibile e semanticamente corretto avere un pulsante con 2 azioni (una primaria e una secondaria), piuttosto che avere un div con 2 pulsanti all'interno. Soprattutto dal momento che le mie regole CSS lo definiscono come uno dei miei normali pulsanti (azione singola) appena divisi da un separatore verticale. Se non troverò alcuna soluzione dovrò fare questo compromesso e andare con le div. Grazie ancora – Bogdan

-1

provare a cambiare

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

Questo dovrebbe risolvere il problema fuori del blocco. la ragione per cui il suo non funziona è perché il suo seguito attraverso con l'azione predefinita di un pulsante, che è quello di presentare. es pULSANTE avrebbe bisogno return false in javascript per leggere il tuo clic. Proprio come se dovessi provare a fare clic su un link con out impostando la sua azione predefinita per restituire false.

Se si aggiunge la seguente riga di codice jQuery a js, questo dovrebbe risolvere anche il problema. Assicurati di aggiungere il codice prima del pulsante> span fai clic su bind.

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

Spero che questo aiuti.

-D

+0

Grazie per i suggerimenti, ma nessuno dei due risolve il problema (ho provato 'type =" button "' me stesso prima di pubblicare la domanda, ma non l'ho incorporata nel mio esempio perché non ha fatto alcuna differenza). Il problema sembra essere che su Firefox, l'evento click viene catturato solo dall'elemento 'button' e non da alcun elemento figlio. – Bogdan

Problemi correlati