2013-07-03 11 views
5

Sto cercando di ottenere un evento click da attivare se si fa clic sul documento, a meno che non ci sia un clic su un div che ho con un certo nome di classe.Il metodo not() sul selettore jquery non funziona

Ho provato quanto segue ma l'evento non si attiva.

$(document).not(".class").click(function(){ 
     //code 
}); 

$(document).not("div.class").click(function(){ 
     //code 
}); 

$("body").not(".class").click(function(){ 
     //code 
}); 

Qualcuno sa cosa sto facendo male?

Grazie

* Aggiornamento

ho provato il seguente

$(document).on("click", ":not(.class)", function(){ 

$('*:not(.class)',document).click(function(){ 

$(document).find(':not(.class)').click(function(){ 

$("body:not(.thisclass)").doAction(); 

Ma non sta dando alcuna distinzione al div con .class che sto cercando di escludere. L'evento si attiva con qualsiasi clic sul documento.

Ecco il div dal mio html

<div class="pictureBox" id="pictureBox2"> <!--content--></div> 

risposta

8

Si sta collegando il gestore di clic a document stesso, quindi verrà sempre attivato (a meno che non venga gestito da un altro gestore).

Che cosa si dovrebbe fare, invece è utilizzare il delegated forma di .on:

$(document).on("click", ":not(.class)", function(){ 
     //code 
}); 

Questa attacca ancora il gestore di eventi su document, ma questo gestore risponde solo ai clic la cui fonte partite il selettore :not(.class): quando gli eventi bubble up a document jQuery invoca il gestore solo se la sorgente corrisponde al selettore.

+0

+1. Un modo super semplice di spiegare la delega/ribollire con buone risorse di url. Correggere se ho torto, ma un altro modo di fare (meno bello) è fare il '$ (document) .click()' quindi registrare '$ (': not (.class)'). Click (function (e) {e.stopPropagation();}); '. Ciò farà sì che il bubbling si fermi su ".class" su se stesso, non facendo bolle sul documento. – RaphaelDDL

+1

@RaphaelDDL che dovrebbe funzionare, eccetto che non dovresti usare no - tu VUOI quella classe per evitare che il clic del documento. – jcsanyi

+0

@jcsanyi Vero vero. Ho provato a modificare ma era già passato 5 minuti: P Ma sì, il corretto dovrebbe essere '$ ('. Class'). Click (function (e) {e.stopPropagation();});'. Grazie – RaphaelDDL

1

Il problema è che il selettore cerca di indirizzare sia un document o bodysenza classe class non un elemento class al suo interno, si può provare qualcosa di simile:

$('*:not(.class)',document).click(function(){ 

Oppure:

$(document).find(':not(.class)').click(function(){ 
1

Utilizzare :not selector.

$("body:not(#thisid)").doAction(); 

$("body:not(#thisid.thisclass)").doAction(); 

$("body:not(.thisclass)").doAction(); 
Problemi correlati