2012-09-17 12 views
22

Consente di dire che abbiamo una struttura HTML come questoevento Mastering bubbling

<div id="container"> 
    <div id="nested"> 
     <span id="someElement"></span> 
    </div> 
</div> 

... e il nostro obiettivo è quello di avere un listener di eventi sul #containersolo! Quindi, noi leghiamo un ascoltatore (codice jQuery)

$("#container").on('click', function(event) { 
    alert("container was clicked"); 
}); 

che funziona, naturalmente, ma il mio problema con questo approccio è che, dal momento che gli eventi di solito bolla, che ascoltatore anche sparare se abbiamo effettivamente clicchiamo su #nested o #someElement . La mia soluzione attuale solo gestire il click quando il #container viene cliccato è quello di confrontare this con event.target

$("#container").on('click', function(event) { 
    if(this === event.target) { 
     alert("container was clicked"); 
    } 
}); 

La mia domanda: che considerava "best practice"? C'è un modo migliore con jQuery per ottenere lo stesso risultato "out of the box"?

Esempio in azione: http://jsfiddle.net/FKX7p/

+3

IMO, questa è la migliore pratica. – VisioN

+0

@jSang: In realtà gli elementi interni non hanno ascoltatori su un clic. È considerata una buona pratica? associare ogni elemento solo per fermare la propagazione? –

+0

Non vedo neanche un approccio migliore, infatti, stavo per postarlo come risposta finché non ti ho visto che hai già quel codice. –

risposta

0

Soluzione alternativa:

$("#container").click(function(){ 
    alert("container was clicked"); 
}).children().click(function(e) { 
    return false; 
}); 

Ma la soluzione è migliore. jsfiddle.net/FKX7p/2/ (con ritorno false) OR jsfiddle.net/FKX7p/3/ (usando stopPropagation)

ho Utilizza ritorno nel tuo esempio (codice diventa più facile da leggere):

if(this !== event.target) return; 
+1

Inoltre, utilizzare 'event.CurrentTarget! == event.Target' invece di' this' quando richiesto, a causa del possibile cambio di contesto di 'this' quando si utilizza jQuery.proxy: http://api.jquery.com/jQuery .proxy/ – Nope

+0

La soluzione alternativa è peggiore, in quanto aggiunge molti gestori di eventi. – naugtur

+0

@naugtur Sono d'accordo con te, ma prima della funzione 'on' questa soluzione era popolare. – webdeveloper

0

io non sono sicuro che uno il lavoro di più veloce, ma faccio senso che il codice successivo sarà meglio:

$("#container").click(function (e) { 
    if (e.target.id && e.target.id !== "container") return false; 
}); 
+0

Ora controllo solo l'identificatore, con i selettori complessi non riesco a vedere un altro modo tranne il confronto degli oggetti –

2

Un modo alternativo per prevenire eventi da gorgogliare consiste nell'utilizzare event.stopPropagation();

$("#container").on('click', function(event) { 
    alert("container was clicked"); 
}) 
.children().on('click', function(event) { 
    event.stopPropagation(); 
}); 

penso che il vantaggio di utilizzare questo approccio è che se si desidera collegare un altro evento al div nidificato, si può semplicemente utilizzare

$("#nested").on('click', function(event) { 
    event.stopPropagation(); 
    // some action 
}); 

$("#container").on('click', function(event) { 
    alert("container was clicked"); 
});​ 
Problemi correlati