2012-10-06 17 views
38

diciamo che ho un elemento padre, che ha tanti elementi figlio nidificato all'interno di se stesso:jQuery clicca evento il genitore, ma trovare il bambino (cliccato) elemento

<div id="p"> 
    <div id="c1"> 
     <div id="c2"></div> 
     <div id="c3"></div> 
    </div id="c4"> 
     <div id="c5"></div> 
    </div> 
</div> 

ho già associare un evento click sul genitore:

$('#p').bind('click', function() { 
    alert($(this).attr('id')); 
}); 

Poiché l'evento viene assegnato l'elemento padre, vedo sempre l'id genitore, però, mi chiedo se non v'è alcun modo possibile per scoprire quale di questo bambino elementi è stato cliccato?

Inoltre, non posso assegnare alcun evento agli elementi figlio o rimuovere il listener di eventi dal padre div.

risposta

53

È necessario passare l'oggetto evento alla funzione per ottenere l'elemento che ha attivato l'evento, event.target fornirà l'elemento di origine.

Live Demo

$('#p').bind('click', function(event) { 
    alert(event.target.id); 
}); 

o

Live Demo

$('#p').bind('click', function(event) { 
    alert($(event.target).attr('id')); 
}); 

Modifica

Il primo metodo event.target.id è preferito per il secondo $(event.target).attr('id') per prestazioni, semplicità e leggibilità.

+1

grazie amico, funziona! :) ... dovrei aspettare di accettare la tua risposta! – Mahdi

+0

Siete i benvenuti @Mahdi. – Adil

+0

Per la registrazione, '$ (event.target) .attr ('id')' è la versione molto più lenta di 'event.target.id' - vedi http://bit.ly/jqsource e cerca' Sizzle. attr = function'. jQuery (o meglio, Sizzle) deve passare attraverso tutto quel codice per ottenere il tuo id, dove solo usando il DOM lo si ottiene direttamente per te. – Remy

5

Puoi provare il codice qui sotto. Prova anche il jsfiddle (demo).

$('#p').on('click', function(event) { 
    alert(event.target.id); 
});​ 

Try the demo

La risposta alla tua seconda domanda è che si può assegnare evento al bambino e rimuovere dal suo genitore. Controllalo.

.stopPropagation(); 

Impedisce l'evento dalla zampillante l'albero del DOM, prevenendo eventuali gestori genitore dalla notifica della manifestazione. Read more

se si desidera che l'evento specifico che deve essere eseguito solo e lasciare nessun altro evento di essere licenziato si utilizza il codice qui sotto

event.stopImmediatePropagation() 

mantiene il resto dei gestori vengano eseguiti e impedisce l'evento dalla zampillante l'albero DOM. Read more

Spero che questo risolva il problema. Se avete domande per favore non esitate a chiedere. Grazie

+0

grazie per la risposta e la spiegazione! :) – Mahdi

+0

@Mahdi sei il benvenuto :-) – Techie

1

Se i tuoi elementi hanno nipoti, c'è un modo migliore per ottenere solo il bambino. Notare il segno maggiore del segno.

$('.parent > .child').click(function() { 
    // This will be the child even if grandchild is clicked 
    console.log($(this)); 
}); 
Problemi correlati