Simile a this question, ma facendo un ulteriore passo avanti. Vorrei rilevare clic al di fuori di un insieme di elementi, che sto maneggiando nel modo seguente:Rileva clic su elemento esterno?
$('#menu div').live('click', function() {
// Close other open menu items, if any.
// Toggle the clicked menu item.
$('body').one('click', function(event) {
// Hide the menu item.
event.stopPropagation();
});
});
Questo funziona come un fascino, purtroppo, quando un altro elemento del menu è aperto e un secondo viene cliccato, richiede due clic per aprire il secondo elemento. Il primo clic su nasconde la prima voce di menu che era aperta, la seconda mostra il secondo elemento di menu .
Il comportamento "corretto" funziona nel seguente modo:
- Cliccando una voce di menu apre.
- Se si fa clic sulla stessa voce di menu (o sui suoi figli) lo si chiude.
- Facendo clic su un'altra voce di menu si chiude la prima, si apre la seconda.
- Cliccando al di fuori delle voci di menu (aperte) le si chiude.
Ho provato quanto segue in luogo di quanto sopra $('body').one()
fine di ignorare clic su voci di menu con scarso successo:
// Captures click on menu items in spite of the not.
$('*').not('#menu *').one('click', function() { // Hide menu }
$('*:not(#menu)').one('click', function() { // Hide menu }
Come sempre, grazie per qualsiasi aiuto!
Qual è lo scopo di spostare il 'body' clic handler di fuori del click gestore di menu? Sembra che esegua lo stesso compito (senza il sovraccarico di prendere ogni click del corpo se il menu non viene mai aperto) applicandolo dopo l'apertura di una voce di menu. O mi sta sfuggendo qualcosa? – chuckg
È un punto giusto; Considero l'overhead di legare e slegare un evento ogni volta che un utente fa clic su una voce di menu non necessaria. Di solito non ci sarà molto clic su una pagina oltre ad andare in un'altra pagina, nel qual caso il gestore di clic in più è completamente irrilevante. Alla fine della giornata, entrambi sono a posto a seconda delle esigenze, quindi è possibile attenersi al gestore se si adatta alle proprie esigenze. –
e.target non funziona su IE ... –