2011-08-19 14 views
26

C'è un modo per allegare dati a un oggetto evento jQuery mentre si propaga sul DOM?modifica dati evento durante la propagazione

Per chiarire, se si dispone di tre div nidificate, ciascuna con un listener di eventi click, quindi facendo clic sul div più interno risulta in tutti e tre i gestori chiamati dall'interno verso l'esterno (propagazione dell'evento 101). Quello che mi piacerebbe fare è aggiungere alcuni dati all'oggetto evento in ogni gestore che è accessibile al livello successivo. Come lo faccio?

Grazie.

risposta

2

forse ho frainteso la domanda, ma mi sono imbattuto in questa pagina StackOverflow mentre la ricerca di un modo per fare la stessa cosa.

Da allora ho scoperto che è possibile restituire il valore/i valori che si desidera passare alla fine di ogni gestore e quindi accedervi in ​​gestori successivi utilizzando la proprietà event.result?

semplice demo http://api.jquery.com/event.result/

4

Anche se non è possibile collegare direttamente i dati per l'evento, si potrebbe ancora collegare i dati al targetElement via data() di jQuery:

$('div').click(function(e) { 
    var info = $(e.target).data('info') || ''; 
    $(e.target).data('info', info + ' ' + $(this).attr('class')); 
}); 

Ecco il violino: http://jsfiddle.net/eKVmU/

+0

Questa soluzione funziona la prima volta l'evento viene generato, ma i dati persiste attraverso molteplici eventi (sulla jsfiddle, prova a cliccare più volte e vedere cosa succede). Mi piacerebbe davvero un modo di associare i dati con uno specifico click mentre esplode, al contrario di uno specifico elemento ... – josh

+0

@josh - Perché non rimuovi i dati solo quando colpisce l'elemento più esterno? [Vedi qui] (http://jsfiddle.net/eKVmU/7/). –

+0

Downvoted perché non risponde alla domanda posta dall'OP: "collegamento dei dati a un oggetto evento jQuery". La seconda risposta più votata fa proprio questo e dovrebbe essere in cima, e la risposta accettata ... –

36

L'oggetto evento che viene passato da jQuery è un wrapper attorno all'oggetto evento nativo. Il bubbling avviene a livello di javascript/browser e quindi l'oggetto evento nativo sembra essere condiviso tra tutti i gestori di eventi.

$('div').click(function(e) { 
    e.originalEvent.attribute = (e.originalEvent.attribute || "") + 
     " " + $(this).prop("className"); 
    alert(e.originalEvent.attribute); 
}); 

Testato in Chrome, Firefox, Safari, IE9 e IE10. Se si esegue il test in altri browser, si prega di commentare con i risultati.

Ecco il violino: http://jsfiddle.net/5AQqD/

+2

Ho appena provato questo su IE10/9 e lavori. Questa dovrebbe essere la soluzione corretta. –

+0

Bummer, nessun supporto IE8. – johntrepreneur

+0

Questo è esattamente ciò di cui avevo bisogno, grazie. Questo dovrebbe davvero essere documentato su MDN. – nils

Problemi correlati