2013-10-28 13 views
5

Ho un HTML simile a questo:jQuery on() - è event.delegateTarget il modo migliore per ottenere il contenitore principale della funzione on()?

<div class="ajax_table_container"> 
    <table> 
     <tr> 
      <td><a href="ajax.php?action=delete&id=1" class="delete_element">DELETE</a></td> 
     </tr> 
     <tr> 
      <td><a href="ajax.php?action=delete&id=2" class="delete_element">DELETE</a></td> 
     </tr> 
    </table> 
</div> 

e JavaScript:

$("div.ajax_table_container").on("click", "a.delete_element", function (event) { 
    var adr = $(this).attr("href");  
    $(event.delegateTarget).html("TEST"); 
    return false; 
}); 

In un'applicazione reale che sto ricaricando contenuto della richiesta Ajax l'indirizzo fornito nel link cliccato.

La mia domanda è, però, è il metodo che sto usando meglio per ottenere il div principale (con classe ajax_table_container). Sto parlando del frammento: event.delegateTarget. C'è un modo migliore di farlo in jQuery? (. Btw io non voglio usare $('div.ajax_table_container') qui - ci potrebbe essere un paio di questi div in una sola pagina)

FIDDLE

EDIT: Dopo aver ottenuto alcune risposte e controllando google mi piacerebbe segnare me stesso come duplicato ;-) Qui: How to get parent selector with jquery.on('click'), base on the clicked element

+0

* "Sto parlando del frammento:' event.delegateTarget'. C'è un modo migliore per farlo in jQuery? "* Meglio come? Questo è esattamente ciò che è "delegateTarget", ed è un riferimento agli elementi DOM, quindi è quanto di più efficiente si possa desiderare. Sembra che tu abbia una ragione per non volerlo usare ...? –

+0

possibile duplicato di [Come ottenere il selettore genitore con jquery.on ('clic'), in base all'elemento su cui si fa clic] (http://stackoverflow.com/questions/17431399/how-to-get-parent-selector-with -jquery-onclick-base-sull'elemento-cliccato) –

+0

Sì, dopo aver controllato le risposte ho scoperto che è un possibile duplicato. Beh, non ho alcuna ragione per NON usarlo, ho appena trovato delegateTarget sperimentalmente usando 'console.log (event)' e non ne sapevo molto, quindi ho pensato di doverlo chiedere. –

risposta

8

Se il tuo obiettivo è ottenere l'elemento sul quale hai agganciato l'evento, non è solo l'opzione migliore, ma quasi l'unica opzione.

Un'altra opzione, che io non sto sostenendo, è quello di ricordare ciò che è stato utilizzato in una variabile che il gestore di eventi chiude sopra:

var $container = $("div.ajax_table_container"); 
$container.on("click", "a.delete_element", function (event) { 
    var adr = $(this).attr("href");  
    $container.html("TEST"); 
    return false; 
}); 

Ma dal momento che jQuery che ti dà a portata di mano delegateTarget, che è quello che ho' d usa il blocco di una buona ragione per usare qualcos'altro. Il costo del passaggio di un riferimento di elemento (anziché di un selettore) a $() non è affatto grande, è probabile che qualsiasi altra cosa tu stia facendo nel gestore mana il sovraccarico che aggiunge.

+0

Grazie per la tua risposta dettagliata, che è più prefferita però, 'delegateTarget' o' closest() 'dal suggerimento di Patsy Issa? –

+1

@KeluThatsall: 'closest' deve fare molto più lavoro che combina elementi con il selettore (e devi ripetere il selettore). Io userei 'delegateTarget', questo è esattamente ciò che è per. –

2

È possibile utilizzare .closest():

$(this).closest("div.ajax_table_container"); 

Ciò restituirà il genitore del link cliccato.

+2

Ah, sì, questa è un'altra opzione. Più costoso di 'delegateTarget', però. –

+0

Grazie, che è più prefferato? –

+2

@KeluThatsall Vado con delegateTarget, perché eseguire l'operazione extra quando è già disponibile. –

0

Dal momento che, si sta utilizzando event delegation qui per registrare il gestore di eventi, l'opzione migliore per ottenere l'elemento ajax_table_container cui è collegato il momento cd gestore di eventi jQuery è quello di utilizzare il event.delegateTarget qui.

Problemi correlati