2010-04-27 6 views
5

Ich habe ein Menü in jQuery, wenn Sie auf einen Link klicken, der geöffnet wird, aber ich möchte es so, wenn Sie woanders klicken, wo sonst nicht das Menü ist, wird es ausgeblendet.Der beste Weg zu tun: nicht in jQuery?

Im Moment arbeite ich an

ein Click-Ereignis bin Bindung
$(':not(#the_menu)') 

Aber das scheint, wie ich ein Click-Ereignis für die gesamte minus Menü bin verbindlich, ist es eine effizientere Art und Weise etwas zu tun, wie Dies?

Antwort

7

Der beste Weg, dies zu tun ist mit sprudelnden capture, wie folgt aus:

$(document).click(function() { 
    //close menu 
}) 

$("#the_menu").click(function(e) { 
    e.stopPropagation(); 
}); 

Wie das funktioniert, jeder Klick Blasen ist (es sei denn, Sie aufhören, in der Regel durch return false; oder event.stopPopagation()), so was auch immer Sie Blasen klicken den ganzen Weg bis zu DOM ... wenn ein Klick das macht, schließen wir das Menü. Wenn es von innerhalb das Menü kommt, stoppen wir die Blase ... so dass der Klick nicht aufbläht und einen Abschluss auslöst. Dieser Ansatz verwendet nur 2 Event-Handler anstelle von 1 auf alles aber das Menü, so sehr leicht :)

+0

Woops hatte "Propagation" drin, behoben –

+0

Wow, das ist cool. Prost. Müssen Sie das Ereignis in allen Browsern sprudeln, wissen Sie, was es ist. Have a bicky. – Smickie

+0

@Smickie - Glücklicherweise normalisiert jQuery das Blubbern sehr gut (mit ein paar * Ausnahmen), so dass 'Klick' konsequent funktioniert. Der große, auf den man achten sollte, ist 'change', der im IE nicht richtig bubbliert, was' .live ("change", ..) 'problematisch macht. –

0

Attach Ereignis Dokument Körper ($(body)). befestigen auch ein anderes Ereignis zu #the_menu dass Block Ereignispropagierung suchen:

$(document.body).click(function() { 
    //close menu if opened 
}); 

$("#the_menu").click(function(e) { 
    //code heere 

    e.stopPropagation(); 
}); 
0

Wie über die Menüanzeige über das Element zu schweben, in der Bindung es enthalten ist?

$("#parentId").hover(
    function() { //!! on hovering in 
     $("#targetId").attr("display","block") ; 
    } , 
    function() { //!! on hovering out 
     $("#targetId").attr("display","none") ; 
    } 
) ; 

Wenn es zu Ihrem Ziel passt, scheint dies einfacher zu warten.

Verwandte Themen