2012-10-02 16 views
8

Quiero hacer algo cuando hago clic en cualquier parte, excepto cuando hago clic en un div y son hijos. Esto es lo que he probado hasta ahora, pero que no está funcionando (clic en él de los niños todavía ejecuta lo que está dentro de los corchetesjQuery al hacer clic en todo excepto en un div y sus hijos

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

no puedo usar algo como esto:.

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

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

Dado que la función .not no es algo que pueda poner dentro de la función .on().

¿Cómo puedo ¿lograr esto?

+0

añadir una clase a las del niño, y comprobar que? – Mathlight

+0

¿No crees que sería mucho más simple? El div que quiero excluir es bastante grande, y es probable que olvide agregar esa clase específica cada vez. –

+0

¿Mayby tienes algo en esto ??? http://api.jquery.com/parent/ – Mathlight

Respuesta

7

lo utilice con una coma para tener los dos selectores: el propio elemento y los elementos hijos

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

jsFiddle

6

Usted puede comprobar dentro de la función para el elemento en cuestión:

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

las burbujas del elemento, es por eso que se dispara en el elemento #calculator, debes verificar si el objetivo es hijo de #calculator o del elemento calculador #itself. – Bax

+0

@Bax Tienes razón, actualicé mi respuesta para buscar descendientes también. –

+0

Sí, eso es increíble :) Creo que prefiero la respuesta de epascarello, porque mantiene mi código un poco más limpio :) –

-1

En lugar de

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

});​ 

Puede utilizar (se prefiere esta versión ya que es más performante)

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

});​ 

o

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

});​ 
+0

Tu respuesta derrota el propósito de 'on'. Sí, funcionaría, pero está agregando forma a muchos manejadores de clics en la página. – epascarello

+0

sí, correcto ... corregido ahora. ¡Gracias! – prashanth

1

no tengo suficiente requisito para agregar commend, así que tengo que hacer mi pregunta aquí al @epascarello. Cuando hice pocos hijos, A y B todavía se vieron afectados. No estoy seguro de estar equivocado o no, pero realmente quiero obtener una solución.

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

Live Demo

Cuestiones relacionadas