2009-12-17 6 views
4

Quelqu'un pourrait m'aider avec ça? :jquery document corps un clic événement

J'ai un bouton qui quand on clique il montre un certain div. Cette div a plusieurs descendants. Maintenant, ce que je veux, c'est que lorsque je clique ailleurs dans le document, mais pas dans aucun de ces descendants que ce div disparaisse. ce que je pensais était d'utiliser le sélecteur pas comme ceci:

$("#button").click(function(){ 
    $("#mydiv").show(); 
    $(document.body).not($("#mydiv").children()).one('click',function(e) { 
     $("#mydiv").hide(); 
    }); 
     return false; 
}); 

mais cela ne fonctionne pas! Une idée pourquoi? merci

+0

Aussi, ma question: Je comprends que l'on lie l'événement une seule fois à tous les éléments correspondants. Donc si l'utilisateur clique sur "element a" en dehors du div (le div est maintenant caché) puis clique sur "element b" en dehors du div, cet évènement se déclenchera à nouveau pour "element b" ?? – ram

Répondre

15

Que diriez-vous de vérifier l'événement de clic pour voir ce qui a été cliqué? Plus précisément, regardez le event.target.

$(document).click(function(event) { 
    var target = $(event.target); 

    if (!target.attr('id').match(/^mydiv/) && target.parents('#mydiv').length == 0) { 
    $('#mydiv').hide(); 
    } 
}); 

J'ai déjà utilisé ce code pour fermer une fenêtre ouverte lorsqu'un utilisateur clique n'importe où à l'exception de la fenêtre.

+0

Je ne veux pas exclure seulement cet id mais aussi tous les descendants de cet élément – Manuel

+0

Essayez le code mis à jour, il faut vérifier que la cible n'a pas de parents dont l'identifiant est "mydiv". –

+0

parfait! Merci – Manuel

5

Utilisez le plus proche pour vérifier si la cible est un descendant de mydiv.

$("#button").click(function(){ 
    $("#mydiv").show(); 
    $(document.body).click(function() { 
     if ($(event.target).closest("#mydiv").length == 0) 
      $("#mydiv").hide();  
    }); 
    return false; 
}); 

Vous ne pouvez pas utiliser one() parce que l'événement serait supprimeront si vous cliquez à l'intérieur mydiv. Vous devrez faire un détachement d'événement personnalisé si vous voulez le supprimer.

+0

cela ne fonctionne pas car l'objet $ (this) est le document.body – Manuel

+0

Désolé. Vous avez oublié d'utiliser la cible. Fixé. – Joel

0

Le problème est peut-être ce que vous êtes de passage dans la .not() d'exclure

.not($("#mydiv").children()) 

Au moment où vous passez un objet jQuery, mais from the docs, ce qui est passé dans .not() doit être une chaîne selector, un élément DOM ou un tableau d'éléments DOM. Par conséquent, la conversion simplement l'objet jQuery à un ensemble d'éléments devraient travailler

$("#button").click(function(){ 
    var myDiv = $("#mydiv").show(); 
    $(document.body).not(myDiv.children().get()).one('click',function(e) { 
     myDiv.hide();  
    }); 
     return false; 
}); 
+0

Eh bien, j'ai appris quelque chose de nouveau maintenant, mais ne résout toujours pas mon problème. Merci quand même – Manuel

Questions connexes