2011-10-07 9 views
6

Ho un menu di esempio html:Come aggiungere eventi click per nome classe?

<div class="mmenu"> 
    <ul> 
     <li> 
      <div class="menu_button" id="m1" >A</div> 
     </li> 
     <li> 
      <div class="menu_button" id="m2" >B</div> 
     </li> 
     <li> 
      <div class="menu_button" id="m3" >C</div> 
    </ul> 
</div> 

Posso aggiungere evento click per ogni elemento del menu nome della classe?

$('.menu_button').click(function() { 
    if (id == "m1") .... 
}) 

risposta

17

Suggerirei di utilizzare la funzione live, invece di .click, perché anche gli elementi aggiunti in fase di esecuzione saranno cliccabili.

$('.menu_button').live('click', function() { 
    var id = $(this).attr('id'); 
    if (id == "m1") { 
     //do your stuff here 
    } 
}); 
+0

Vecchio post, ma ha risolto il mio problema –

+9

Ora è preferibile usare '. On()' invece di '. vivere() '. Vedi altre risposte. – Luke

+1

live() è obsoleto dal 1.7 e rimosso dal 1.9. Vedi [http://api.jquery.com/live/](http://api.jquery.com/live/) – Virtual

5

È possibile trovare l'ID con this.id

$('.menu_button').click(function() { 
    if (this.id == "m1") .... 
}) 

Ma se il codice è completamente diverso per ogni pulsante, allora non può essere utile usare in quel modo, ma invece associa un gestore diverso per ogni id.

+1

Un sightly modo migliore è di $ ('.mmenu'). delegate ('. menu_button', 'click', function() {if (this.id == "m1") ....}) mentre posiziona un gestore di clic a livello genitore ascolta gli eventi di clic attivati ​​da un elemento con una classe di menu_button. –

+0

@Alistair, molto vero .. ma dal momento che l'OP sembra un principiante in jQuery, volevo andare lento :) –

1

Sì. È possibile associare un gestore di eventi click a qualsiasi set di elementi DOM, indipendentemente dal fatto che siano selezionati per classe o altro. La sintassi nell'esempio è corretta e il gestore di eventi sarà associato a ciascun elemento corrispondente dal selettore.

Tuttavia, tenere presente che nell'esempio id non sarà definito. Dovresti utilizzare this.id, poiché this farà riferimento all'elemento su cui è stato fatto clic.

0

Se ho capito bene la tua domanda, provare a utilizzare questo:

$('.menu_button').click(function() { 
    if ($(this).attr('id') == "m1") .... 
}) 

Btw: In questo caso, un switch .. case sarebbe molto più appropriato!

23

ottimizzare il codice per non usarelive() come non possiamo fermare la propagazione di live() eventi

Usa on() (jQuery 1.7+) o delegate() (sotto 1.7)

Most soluzione efficiente per il tuo scenario in questo caso sarebbe:

// $('.mmenu').on("click", ".menu_button", function() { // jQuery 1.7 & up 
    $('.mmenu').delegate(".menu_button", "click", function() { 
     var id = $(this).attr('id') // or this.id 
     if (id == "m1") { 
      // ..code 
     } 
    }); 

In questo modo, si ha un solo clic evento legato al div principale $('.mmenu'), che funziona anche se si aggiungono elementi (nuovo li con div) in futuro

Problemi correlati