Differenza tra .on ('click') vs .click ()


526

C'è qualche differenza tra il seguente codice?

$('#whatever').on('click', function() {
     /* your code here */
});

e

$('#whatever').click(function() {
     /* your code here */
});

Risposte:


762

Penso che la differenza sia nei modelli di utilizzo.

Preferirei .onpiù .clickperché il primo può usare meno memoria e lavorare per elementi aggiunti dinamicamente.

Considera il seguente html:

<html>
    <button id="add">Add new</button>
    <div id="container">
        <button class="alert">alert!</button>
    </div>
</html>

dove aggiungiamo nuovi pulsanti tramite

$("button#add").click(function() {
    var html = "<button class='alert'>Alert!</button>";
    $("button.alert:last").parent().append(html);
});

e vuoi "Avviso!" per mostrare un avviso. Per questo possiamo usare "click" o "on".


Quando usiamo click

$("button.alert").click(function() {
    alert(1);
});

con quanto sopra, viene creato un gestore separato per ogni singolo elemento che corrisponde al selettore. Questo significa

  1. molti elementi corrispondenti creerebbero molti gestori identici e quindi aumenterebbero il footprint di memoria
  2. gli articoli aggiunti dinamicamente non avranno il gestore - vale a dire, nell'html sopra il "Avviso!" appena aggiunto i pulsanti non funzioneranno se non si ricollega il gestore.

Quando usiamo .on

$("div#container").on('click', 'button.alert', function() {
    alert(1);
});

con quanto sopra, un unico gestore per tutti gli elementi che corrispondono al tuo selettore, compresi quelli creati dinamicamente.


... un altro motivo per usare .on

Come ha commentato di seguito Adrien, un altro motivo per utilizzare .onè rappresentato dagli eventi con spaziatura dei nomi.

Se aggiungi un gestore con .on("click", handler)te lo rimuovi normalmente con il .off("click", handler)quale rimuoverà quel gestore. Ovviamente questo funziona solo se hai un riferimento alla funzione, quindi cosa succede se non lo fai? Usa gli spazi dei nomi:

$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });

con svincolo via

$("#element").off("click.someNamespace");

2
Che dire di: $ ('button.alert'). On ('click', function () {alert (1);}); ?
Matteo

8
@andreister: correggimi se sbaglio, ma credo che un altro vantaggio sia l'utilizzo degli spazi dei nomi durante l'utilizzo on('click' ...), vedi stackoverflow.com/a/3973060/759452 ie. on('click.darkenallothersections' ...)e allo stesso tempo on('click.displaynextstep' ...), allora posso sciogliere solo quello che scelgo usando.unbind('click.displaynextstep')
Adrien Be

Non penso che venga creato un gestore separato per ogni elemento che corrisponde al selettore. Penso che verrebbe creato 1 gestore, ma che l'overhead proviene dall'associazione di questo gestore a più elementi e dal monitoraggio di tutti questi elementi. Almeno, non l'ho trovato nella documentazione.
Traccia il

7
Qualcuno può spiegare perché .on può funzionare con elementi aggiunti dinamicamente ma .click non può?
MengT

2
on()è la tendenza in jQuery. Ho dovuto eseguire l'aggiornamento $(window).load(function() {});a $(window).on("load", function (e) {})jQuery 3.
Victor Stoddard l'

37

C'è qualche differenza tra il seguente codice?

No, non esiste alcuna differenza funzionale tra i due esempi di codice nella domanda. .click(fn)è un "metodo di scelta rapida" per .on("click", fn). Dalla documentazione per.on() :

Esistono metodi abbreviati per alcuni eventi come quelli .click()che possono essere utilizzati per collegare o attivare gestori di eventi. Per un elenco completo dei metodi di stenografia, vedere la categoria degli eventi .

Si noti che .on()differisce dal fatto .click()che ha la possibilità di creare gestori di eventi delegati passando un selectorparametro, mentre .click()non lo è. Quando .on()viene chiamato senza un selectorparametro, si comporta esattamente come .click(). Se si desidera la delega degli eventi, utilizzare .on().


4
che dire del problema delle prestazioni ha sottolineato il mio @andreister?
rubo77,

@ rubo77 al massimo trascurabile. Stiamo prendendo millisecondi a cifra singola.
Rory McCrossan,

1
@RoryMcCrossan è un grosso problema per me - lo sto cercando perché ho fino a 3000 domande su una pagina che necessita di eventi. Un milisec ciascuno fa sì che la mia pagina impieghi 3 secondi in più per essere eseguita. Il tuo commento non è utile per le grandi liste.
Randy,

11
Il problema più grande è perché hai 3000 domande su una pagina. Se segui buoni schemi di interfaccia utente non dovresti mai avere così tante informazioni in una pagina. Cerca il paging o il caricamento lento. Anche usare la delega degli eventi per avere un unico gestore di eventi per tutti quegli elementi sarebbe meglio.
Rory McCrossan,

5
@ rubo77 - Il guadagno in termini di prestazioni è visibile solo quando si utilizza la delega di eventi passando un selectorparametro. Se si chiama .on()senza un selectorparametro, non vi è alcun miglioramento delle prestazioni rispetto all'utilizzo .click().
gilly3,

23

.on()è il modo consigliato per eseguire il binding di tutti gli eventi a partire da jQuery 1.7. Rotola tutte le funzionalità di entrambi .bind()e .live()in una funzione che altera il comportamento quando si passano parametri diversi.

Come hai scritto il tuo esempio, non c'è differenza tra i due. Entrambi vincolano un gestore clickall'evento di #whatever. on()offre ulteriore flessibilità nel consentire all'utente di delegare eventi attivati ​​da bambini #whatevera una singola funzione di gestore, se lo si desidera.

// Bind to all links inside #whatever, even new ones created later.
$('#whatever').on('click', 'a', function() { ... });

"Associa tutti i link all'interno di #whatever, anche quelli nuovi creati successivamente." Non è esattamente quello che .live()fa? Inoltre, questo sembra contraddire le altre risposte che affermano che ha solo la funzionalità di .click(), e quindi non si applica agli eventi futuri.
bgcode

3
@babonk - Questo non contraddice le altre risposte, perché come ha detto Interrobang nel primo paragrafo .on()può fare ciò che .click()fa e fare cosa .bind()e .live()fare - dipende da quali parametri lo chiami. (Alcune altre risposte hanno menzionato anche questo.) Nota però che "Associa a tutti i collegamenti all'interno di #whatever" non è ciò che .live()fa, è ciò che .delegate()fa. .live()si lega a tutti gli interni documentanziché lasciarti specificare il contenitore. Nota anche .live()è deprecato da jQuery 1.7 in poi.
nnnnnn,

+1 per eventi delegati: "Scegliendo un elemento che è garantito per essere presente al momento in cui il gestore eventi delegato è collegato, è possibile utilizzare eventi delegati per evitare la necessità di associare e rimuovere frequentemente gestori eventi." api.jquery.com/on
jimasp

19

Come menzionato dalle altre risposte:

$("#whatever").click(function(){ });
// is just a shortcut for
$("#whatever").on("click", function(){ })

Notando però che .on()supporta diverse altre combinazioni di parametri che .click()non lo fanno, permettendogli di gestire la delega di eventi (superceding .delegate()e .live()).

(E ovviamente ci sono altri metodi di scelta rapida simili per "keyup", "focus", ecc.)

Il motivo per cui sto postando una risposta extra è menzionare cosa succede se si chiama .click()senza parametri:

$("#whatever").click();
// is a shortcut for
$("#whatever").trigger("click");

Notando che se lo usi .trigger()direttamente puoi anche passare parametri extra o un oggetto evento jQuery, che non puoi fare .click().

Volevo anche menzionare che se guardi il codice sorgente di jQuery (in jquery-1.7.1.js) vedrai che internamente la funzione .click()(o .keyup(), ecc.) Chiamerà effettivamente .on()o .trigger(). Ovviamente questo significa che puoi essere certo che hanno davvero lo stesso risultato, ma significa anche che l'utilizzo .click()ha un po 'più di costi generali - non c'è nulla di cui preoccuparsi o addirittura pensare nella maggior parte delle circostanze, ma teoricamente potrebbe importare in circostanze straordinarie.

EDIT: Infine, si noti che .on()consente di associare più eventi alla stessa funzione in una riga, ad esempio:

$("#whatever").on("click keypress focus", function(){});

I metodi non sono entrambi caricati in memoria da usare? Quindi non importa? E per leggibilità è forse più maneggevole?
Vince V.

@VinceV. - Sì. Per i gestori di eventi non delegati "standard", entrambi i metodi fanno la stessa cosa e la differenza di prestazioni è trascurabile, quindi quale metodo si utilizza è in realtà una questione di preferenza personale. (Di solito sceglierei .click().)
nnnnnn,

9

No, non c'è.
Il punto on()è i suoi altri sovraccarichi e la capacità di gestire eventi che non hanno metodi di scelta rapida.


1
@arigold: quelli sono gli altri sovraccarichi.
SLaks

9

Sembrano essere gli stessi ... Documentazione dalla funzione click () :

Questo metodo è un collegamento per .bind ('click', gestore)

Documentazione dalla funzione on () :

A partire da jQuery 1.7, il metodo .on () fornisce tutte le funzionalità necessarie per collegare i gestori di eventi. Per assistenza nella conversione da metodi di eventi jQuery precedenti, consultare .bind (), .delegate () e .live (). Per rimuovere gli eventi associati a .on (), consultare .off ().


Entrambe le tue opinioni dovrebbero essere unite. Click () è una scorciatoia per .Bind () e .On () ... Come per JQUERY 1.7.0 +, è anche una scorciatoia per Trigger ('click'). [ api.jquery.com/click/]
Dhanasekar,

Questa è una spiegazione piuttosto semplice dai documenti, ma la risposta di seguito ha un buon esempio del perché uno è migliore dell'altro in .clickvs.on
phatskat,

@phatskat - Mi capita di essere d'accordo con te :)
dana

8

.click gli eventi funzionano solo quando viene eseguito il rendering dell'elemento e sono collegati solo agli elementi caricati quando il DOM è pronto.

.on gli eventi sono collegati dinamicamente agli elementi DOM, il che è utile quando si desidera associare un evento agli elementi DOM che sono resi su richiesta Ajax o qualcos'altro (dopo che il DOM è pronto).


5

Qui troverai l'elenco dei diversi modi di applicare l'evento click. Puoi selezionare di conseguenza come gradevole o se il tuo clic non funziona basta provare un'alternativa tra queste.

$('.clickHere').click(function(){ 
     // this is flat click. this event will be attatched 
     //to element if element is available in 
     //dom at the time when JS loaded. 

  // do your stuff
});

$('.clickHere').on('click', function(){ 
    // same as first one

    // do your stuff
})

$(document).on('click', '.clickHere', function(){
          // this is diffrent type 
          //  of click. The click will be registered on document when JS 
          //  loaded and will delegate to the '.clickHere ' element. This is 
          //  called event delegation 
   // do your stuff
});

$('body').on('click', '.clickHere', function(){
   // This is same as 3rd 
   // point. Here we used body instead of document/

   // do your stuff
});

$('.clickHere').off().on('click', function(){ // 
    // deregister event listener if any and register the event again. This 
    // prevents the duplicate event resistration on same element. 
    // do your stuff
})

3

Ora hanno deprecato click (), quindi è meglio andare con on ('click')


Quindi cosa fai se vuoi il vecchio comportamento click () adesso?
bgcode

1

Per quanto riguarda ilearned da internet e alcuni amici .on () viene utilizzato quando si aggiungono elementi in modo dinamico. Ma quando l'ho usato in una semplice pagina di accesso in cui l'evento click dovrebbe inviare AJAX a node.js e al ritorno aggiungere nuovi elementi ha iniziato a chiamare chiamate multi-AJAX. Quando l'ho cambiato per fare clic su () è andato tutto bene. In realtà non ho affrontato questo problema prima.


0

NUOVI ELEMENTI

Come aggiunta alle risposte complete sopra per evidenziare i punti critici se si desidera che il clic si allega a nuovi elementi:

  1. gli elementi selezionati dal primo selettore, ad esempio $ ("body") devono esistere al momento della dichiarazione, altrimenti non c'è nulla a cui allegare.
  2. è necessario utilizzare i tre argomenti nella funzione .on () incluso il selettore valido per gli elementi target come secondo argomento.

-1
$('.UPDATE').click(function(){ }); **V/S**    
$(document).on('click','.UPDATE',function(){ });

$(document).on('click','.UPDATE',function(){ });
  1. è più efficace di $ ('. UPDATE'). click (function () {});
  2. può usare meno memoria e lavorare per elementi aggiunti dinamicamente.
  3. un po 'di tempo i dati recuperati dinamici con il pulsante modifica ed elimina non generano l'evento JQuery al momento della MODIFICA O ELIMINA DATI dei dati di riga nel modulo, quel tempo $(document).on('click','.UPDATE',function(){ });funziona effettivamente come gli stessi dati recuperati usando jquery. pulsante non funzionante al momento dell'aggiornamento o dell'eliminazione:

inserisci qui la descrizione dell'immagine


$ (documento) .on ('click', '. UPDATE', function () {}); 1) è più efficace di $ ('. AGGIORNAMENTO'). Click (function () {}); 2) può usare meno memoria e lavorare per elementi aggiunti dinamicamente. 3) un po 'di tempo i dati recuperati dinamici con il pulsante modifica ed elimina non generano l'evento JQuery al momento della MODIFICA O ELIMINA DATI dei dati di riga nel modulo, quel tempo $ (documento) .on (' clic ','. AGGIORNAMENTO ', funzione () {}); funziona in modo efficace. [come gli stessi dati recuperati usando jquery. pulsante non funzionante al momento dell'aggiornamento o
dell'eliminazione
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.