Voglio creare un evento singolo attivato facendo clic ovunque. Questo evento viene creato facendo clic su un pulsante. Non voglio che l'evento si attivi a seguito del clic sul pulsante, solo i clic successivi ovunque (incluso il pulsante).setTimeout e propagazione evento
Quindi dire che ho avuto qualche HTML simile al seguente:
<body>
<div id="someparent">
<div id="btn"></div>
</div>
</body>
E il seguente javascript (jQuery):
$('#btn').click(function() {
$(document).one('click', function() {
console.log('triggered');
});
});
$('#someparent').click(function() {
// this must always be triggered
});
voglio evitare di fermarsi propagazione degli eventi, ma in quanto sopra Ad esempio, l'evento è destinato a documentare, quindi l'evento esplode e l'evento viene attivato.
Un modo per risolvere questo problema sembra essere quello di avvolgere la creazione di eventi in un timeout:
$('#btn').click(function() {
setTimeout(function() {
$(document).one('click', function() {
console.log('triggered');
});
}, 1);
});
$('#someparent').click(function() {
// this must always be triggered
});
Ora, questo funziona bene, ma mi chiedo se questo è sicuro. Qualche idea di ordine di esecuzione garantisce che funzioni sempre, o funziona solo per caso? So che ci sono altre soluzioni (ad esempio un altro evento nidificato .one()
), ma sono specificamente alla ricerca di una risposta a come setTimeout e la propagazione degli eventi interagiscono.
Il seguente violino mostra due div. Il primo ha il comportamento sbagliato (l'evento del documento viene attivato immediatamente). Facendo clic sul secondo div, e quindi in un punto qualsiasi del documento (area bianca) illustra il comportamento desiderato:
https://jsfiddle.net/Lwocuuf8/7/
Non riesci a cablare l'evento click e semplicemente rimuovere la maniglia una volta che l'evento ha stato attivato (a meno che la sorgente sia il pulsante)? –
Non sono sicuro di capire cosa intendi? – jkgeyti
è sufficiente restituire false per evitare bolle sparse – TecHunter