2012-10-02 9 views
8

Voglio fare qualcosa quando clicco ovunque, tranne quando faccio clic su un div e sono bambini. Questo è quello che ho provato finora, ma non funziona (cliccando su di esso per bambini esegue ancora ciò che è all'interno delle parentesijQuery sul clic su tutto tranne un div ed è bambini

$('body').on('click', '* :not(#calculator)', function(e){ 

non posso usare qualcosa di simile a questo:.

jQuery - Select everything except a single elements and its children?

$("body > *").not("body > #elementtokeep").remove(); 

Poiché la funzione .not non è qualcosa che posso mettere all'interno della funzione .on().

Come posso raggiungere questo?

+0

aggiungere una classe al bambino, e controllare che? – Mathlight

+0

Non credi che sia molto più semplice? Il div che voglio escludere è abbastanza grande, e probabilmente mi dimenticherò di aggiungere quella classe specifica ogni volta. –

+0

Mayby hai qualcosa su questo ??? http://api.jquery.com/parent/ – Mathlight

risposta

7

Non utilizzare con una virgola di avere entrambi i selettori: l'elemento stesso e gli elementi figli

jQuery(document.body).on("click", ":not(#calculator, #calculator *)", function(e){ 
    console.log(this); 
    e.stopPropagation(); 
});​​​​​​​ 

jsFiddle

6

Si potrebbe verificare all'interno della funzione per l'elemento in questione:

$('body').click(function(e){ 
    if (!$(e.target).is("#calculator") || $("#calculator").has(e.target).length) { 
     // do your stuff 
    } 
}); 
+1

l'elemento bolle, ecco perché viene attivato sull'elemento #calculator, è necessario verificare se il target è un figlio di #calculator o dell'elemento calculator #itself. – Bax

+0

@Bax Hai ragione, ho aggiornato la mia risposta per controllare anche i discendenti. –

+0

Sì, è fantastico :) Penso che preferisco la risposta di epascarello, perché mantiene il mio codice un po 'più pulito :) –

-1

anziché

$('body').on('click', '* :not(#calculator)', function(e){ 

});​ 

È possibile utilizzare (questa versione è preferito in quanto è più performante)

$("body").on("click", ":not(#calculator, #calculator *)", function(e){ 

});​ 

o

$("body :not(#calculator, #calculator *)").on("click", function(e){ 

});​ 
+0

La tua risposta sconfigge lo scopo di "on". Sì, funzionerebbe, ma stai aggiungendo il modo a molti gestori di clic per la pagina. – epascarello

+0

sì, giusto .. corretto ora. Grazie! – prashanth

1

io non ho abbastanza obbligo di aggiungere Commend, quindi ho bisogno di chiedere la mia domanda qui a @epascarello. Quando ho fatto pochi figli, A e B sono ancora colpiti. Non sono sicuro di sbagliarmi o no, ma voglio davvero ottenere una soluzione.

jQuery(document.body).on("click", ":not(#calculator, #calculator *)", function(e){ 
    console.log(this); 
    e.stopPropagation(); 
    alert('test'); 
}); 

Live Demo

Problemi correlati