2010-08-10 5 views
1

J'essaie de créer une fonction jQuery click qui fermera un div lorsque vous cliquerez sur autre chose que ce div. Mon problème est qu'il y a un champ de recherche et un autre bouton à l'intérieur de ce div qui doit rester ouvert si vous cliquez dessus.jQuery selector: Pas ce div et pas ce div

Ma fonction actuelle est:

$("*:not(#header)").click(function() { 
    $('#header').slideUp({ 
     duration: 550, 
     easing: 'easeOutExpo' 
    }); 
}); 

Je veux dire aussi « et n'est pas « #categoryMore » et ne« #headerSearch », mais la syntaxe que je l'ai utilisé n'a pas travaillé.

$("*:not(#header, #categoryMore, #headerSearch)") 

et

$("*:not(#header), *:not(#categoryMore), *:not(#headerSearch)") 

Toutes les idées? Merci beaucoup pour votre aide!

+1

Je crois que 'patrick dw' est sur la bonne voie ici, mais le balisage html serait agréable de voir pour obtenir spécifique sur la réponse. –

+0

Si je comprends bien, vous avez des éléments qui sont dans l'en-tête que vous ne voulez pas cacher lorsque l'en-tête est caché. Est-ce le cas? –

+0

j-man86 - Eh bien, quoi que vous finissiez par faire, vous ne voulez * pas * ajouter un gestionnaire à presque * chaque * élément de la page en faisant '$ (" *: not (#header) ")'. C'est terriblement inefficace et ne devrait vraiment pas être utilisé. Peut-être que c'est le problème que vous avez eu avec ma solution. Vous devez vous débarrasser de ce sélecteur. – user113716

Répondre

3

EDIT:

Voici un exemple que vous pouvez tester. J'ai utilisé slideToggle() pour l'exemple afin que vous puissiez le tester plus d'une fois plus facilement.


Mettez un gestionnaire sur le document qui ferme #header.

Ensuite, placez un gestionnaire sur #header qui fait event.stopPropagation() pour empêcher l'événement de bouillonner jusqu'au document lorsque vous cliquez à l'intérieur.

$(document).click(function() { 
    $('#header:visible').slideUp({ 
     duration: 550, 
     easing: 'easeOutExpo' 
    }); 
}); 

$('#header').click(function(event) { 
    event.stopPropagation(); 
}); 

Notez que si d'autres éléments sur la page a un gestionnaire de clic qui utilise event.stopPropagation() ou return false;, l'événement ne sera pas bouillonner le document, et votre #header gagné Ne fermez pas.

Dans ce cas, vous devez le gérer directement dans ce gestionnaire.

+0

qui ne semblait pas faire l'affaire –

+0

@ j-man86 - Voici un exemple. (L'exemple utilise plutôt 'slideToggle()'.) Http://jsfiddle.net/yvFcz/ Qu'est-ce qui n'a pas fonctionné? Êtes-vous en train de dire que le '# header' n'a pas glissé? Ou que cliquer à l'intérieur de l'entête # l'a fait glisser? – user113716

+0

sry:) ... pour spécifier, cliquer à l'intérieur du div #header le fait toujours glisser. –

1

Il y a un plugin jQuery jQuery outside events vous pouvez utiliser:

Avec des événements en dehors jQuery vous pouvez lier à un événement qui sera déclenché que lorsqu'un spécifique événement « d'origine » se produit en dehors l'élément en question. Par exemple, vous pouvez cliquer à l'extérieur, double-cliquez sur à l'extérieur, passez la souris dessus, mettez au point à l'extérieur (et plus de dix autres événements par défaut). En outre, si un événement extérieur n'a pas été fourni par défaut, vous pouvez facilement définir le vôtre.

1

Je pense que vous pouvez utiliser jQuery not() et il pourrait être aussi simple que cela:

$(document).not('#header, #categoryMore, #headerSearch').click(function() { 
    $('#header').slideToggle({ 
     duration: 550, 
     easing: 'easeOutExpo' 
    }); 
}); 

Cela vous permet de cliquer n'importe où en dehors de la #header et l'action sera déclenchée. Vous n'avez pas à vous soucier des autres événements .click() et de leur propagation (du moins pas à ma connaissance) ... il ne suffit pas de sélectionner #header, #categoryMore, et #headerSearch.

Vous pouvez utiliser jQuery slideToggle() pour faire glisser vers le haut et vers le bas l'en-tête et son contenu lorsque vous cliquez en dehors de celui-ci. Si vous voulez seulement le cacher, alors utilisez simplement .slideUp() comme vous le faites maintenant :)

Hope that helps.

+0

Hristo - Utiliser '.not()' de cette manière ne fera rien. La méthode '.not()' est un moyen de supprimer des éléments d'un * set * correspondant au sélecteur donné. Puisque $ (document) 'ne renvoie qu'un seul élément (le' document'), et que cet élément ne correspondra pas au sélecteur donné à '.not()', rien ne sera changé. – user113716

+0

@patrick dw ... OK, je n'étais pas au courant de cela, je suis encore assez nouveau à jQuery. Avez-vous des suggestions sur quoi remplacer '$ (document)'? Nous n'avons pas beaucoup de code source avec lequel travailler, c'est pourquoi je suis allé avec lui en premier lieu. – Hristo

+0

Hristo - Eh bien, si vous deviez utiliser '.not()' comme ça, votre sélecteur aurait besoin de sélectionner * tous * les éléments de la page en utilisant '$ ('*')'. Alors '.not()' filtrerait ces quelques-uns. ** Mais ne faites pas cela. ** Il est terriblement inefficace d'ajouter un gestionnaire à chaque élément. Il est préférable de placer un gestionnaire uniquement sur le 'document', et laissez l'événement' click' naturellement monter en bulle et déclencher le gestionnaire. – user113716

Questions connexes