jQuery.click () vs onClick


559

Ho una grande applicazione jQuery e sto usando i due metodi seguenti per gli eventi clic.

Primo metodo

HTML

<div id="myDiv">Some Content</div>

jQuery

$('#myDiv').click(function(){
    //Some code
});

Secondo metodo

HTML

<div id="myDiv" onClick="divFunction()">Some Content</div>

Chiamata di funzione JavaScript

function divFunction(){
    //Some code
}

Uso il primo o il secondo metodo nella mia applicazione. Qual è il migliore? Meglio per le prestazioni? E standard?


9
Puoi scoprire i vari modi per collegare i gestori di eventi e i loro vantaggi / svantaggi qui: quirksmode.org/js/introevents.html . jQuery è solo un bel wrapper per la registrazione avanzata degli eventi.
Felix Kling,

12
Ricorda di inserire la funzione click all'interno di $ (document) .ready (function ().
joan16v

Risposte:


559

L'uso $('#myDiv').click(function(){è migliore in quanto segue il modello standard di registrazione degli eventi. (jQuery utilizza internamenteaddEventListener e attachEvent).

Fondamentalmente la registrazione di un evento in modo moderno è il modo discreto di gestire gli eventi. Inoltre, per registrare più di un listener di eventi per la destinazione, è possibile chiamare addEventListener()per la stessa destinazione.

var myEl = document.getElementById('myelement');

myEl.addEventListener('click', function() {
    alert('Hello world');
}, false);

myEl.addEventListener('click', function() {
    alert('Hello world again!!!');
}, false);

http://jsfiddle.net/aj55x/1/

Perché usare addEventListener? (Da MDN)

addEventListener è il modo per registrare un listener di eventi come specificato nel DOM W3C. I suoi benefici sono i seguenti:

  • Consente di aggiungere più di un singolo gestore per un evento. Ciò è particolarmente utile per le librerie DHTML o le estensioni Mozilla che devono funzionare bene anche se vengono utilizzate altre librerie / estensioni.
  • Ti dà un controllo più preciso della fase quando viene attivato l'ascoltatore (cattura vs. bolle)
  • Funziona su qualsiasi elemento DOM, non solo su elementi HTML.

Ulteriori informazioni sulla registrazione moderna degli eventi -> http://www.quirksmode.org/js/events_advanced.html

Altri metodi come l'impostazione degli attributi HTML , ad esempio:

<button onclick="alert('Hello world!')">

O proprietà dell'elemento DOM , ad esempio:

myEl.onclick = function(event){alert('Hello world');}; 

sono vecchi e possono essere sovrascritti facilmente.

L'attributo HTML dovrebbe essere evitato in quanto rende il markup più grande e meno leggibile. Le preoccupazioni per contenuto / struttura e comportamento non sono ben separate, rendendo più difficile trovare un bug.

Il problema con il metodo delle proprietà dell'elemento DOM è che solo un gestore eventi può essere associato a un elemento per evento.

Ulteriori informazioni sulla gestione degli eventi tradizionali -> http://www.quirksmode.org/js/events_tradmod.html

Riferimento MDN: https://developer.mozilla.org/en-US/docs/DOM/event


13
Supponiamo che tu esegua $('#myDiv').click(function(){prima il codice, quindi generi 20 righe di HTML in modo dinamico da JavaScript e ogni riga ha un pulsante su di esso che quando si fa clic su JavaScript è necessario per eseguire quella stessa funzione. Se lo fai prima, allora non funzionerà poiché il gestore eventi è stato aggiunto prima della generazione dell'HTML. Sembrerebbe più semplice semplicemente onclick="functionName()"inserire l'HTML generato dinamicamente, quindi il pulsante funziona immediatamente. O conosci una soluzione più elegante per questa situazione?
zuallauz,

17
@zuallauz per quel caso jQuery offre la .delegate()funzione. Allegherà l'evento a qualsiasi elemento che apparirà in futuro sul sito.
Zefiryn,

17
@SimonRobb .liveè obsoleto. Utilizzare .delegateper le versioni precedenti o utilizzare .onper le versioni jQuery più recenti.
Selvakumar Arumugam,

4
@Vega, punti positivi. Che dire della leggibilità? Ora devi cercare tutti i file JS di riferimento nella pagina per vedere tutti i gestori di clic di un elemento in base all'ID dell'elemento anziché cercare il nome della funzione. Cosa ne pensi di questo?
supertonsky,

6
Sono d'accordo con @supertonsky. Sono assolutamente in disaccordo sul fatto che $ ('# myDiv'). Click (function () {è migliore. In un'applicazione javascript di grandi dimensioni l'associazione con un evento diventa enormemente difficile trovare tutti i riferimenti vincolanti per quella destinazione. È l'associazione a una classe , un id, un bambino fa riferimento a un tag html? E cosa succede se i css cambiano e i nomi delle classi che vinceresti devono essere cambiati? Nella mia esperienza di lavoro con altri codici diventa molto brutto molto velocemente.
Jon

65

Per prestazioni migliori, utilizzare JavaScript nativo. Per uno sviluppo più veloce, utilizzare jQuery. Controlla il confronto delle prestazioni su jQuery vs Native Element Performance .

Ho eseguito un test in Firefox 16.0 a 32 bit su Windows Server 2008 R2 / 7 a 64 bit

$('span'); // 6,604 operations per second
document.getElementsByTagName('span'); // 10,331,708 operations/sec

Per gli eventi clic, selezionare Eventi browser nativo vs trigger jquery o Associazioni evento jQuery vs clic nativo .

Test in Chrome 22.0.1229.79 a 32 bit su Windows Server 2008 R2 / 7 a 64 bit

$('#jquery a').click(window.testClickListener); // 2,957 operations/second

[].forEach.call( document.querySelectorAll('#native a'), function(el) {
    el.addEventListener('click', window.testClickListener, false);
}); // 18,196 operations/second

9
jQuery dovrebbe essere in grado di funzionare in molti ambienti diversi, il che rende più robot ed è più facile da scrivere, mantenere, ma se la velocità è la più importante, allora jQuery non è la risposta
Coops

Fai attenzione quando usi forOach cause non è tutto compatibile con il browser, penso non per IE per esempio. Forse un polyfill sarà utile.
khaled_webdev il

39

Da quello che ho capito, la tua domanda non riguarda davvero se usare jQuery o meno. È piuttosto: è meglio associare eventi in linea in HTML o tramite listener di eventi?

L'associazione incorporata è obsoleta. Inoltre in questo modo è possibile associare una sola funzione a un determinato evento.

Pertanto consiglio di utilizzare i listener di eventi. In questo modo, sarai in grado di associare molte funzioni a un singolo evento e di separarle in seguito, se necessario. Considera questo codice JavaScript puro:

querySelector('#myDiv').addEventListener('click', function () {
    // Some code...
});

Funziona con la maggior parte dei browser moderni.

Tuttavia, se includi già jQuery nel tuo progetto, usa semplicemente jQuery: .ono la .clickfunzione.


È possibile registrare più funzioni utilizzando HTML inline come <div onclick = "handler1 (); handler2 (); handler3 ();"> </div>
Kira

2
In questo modo stai ancora registrando solo una "espressione". Ad esempio, se handler1genera un errore handler2e handler3non verrà mai chiamato. Inoltre, non puoi aggiungere e rimuovere in modo dinamico determinate funzioni dall'ascoltatore. E, ultimo ma non meno importante, handler1, handler2e handler3devono essere dichiarate nel campo di applicazione globale che è un odore.
Michał Miszczyszyn,

L'uso try..catchall'interno delle funzioni non funzionerà se handler2non definito. FYI inline JavaScript ovviamente non funziona quando JS è disabilitato nel browser dell'utente, per favore non male informare gli altri.
Michał Miszczyszyn,

Ho detto che non ero sicuro di JavaScript disabilitato. Non sto disinformando o ingannando gli altri
Kira

In tal caso puoi provare il seguente <div onclick = "function () {try {handler1 (); handler2 (); handler3 ();} catch {}}"> </div>
Kira

16

È possibile combinarli, utilizzare jQuery per associare la funzione al clic

<div id="myDiv">Some Content</div>

$('#myDiv').click(divFunction);

function divFunction(){
 //some code
}

14

$('#myDiv').clickè meglio, perché separa il codice JavaScript da HTML . Bisogna cercare di mantenere il comportamento e la struttura della pagina diversi . Questo aiuta molto.


2
Questa risposta ha senso in quanto le persone che progettano e scrivono cose js sono diverse nella maggior parte dei casi. Ed è strano votare questo dopo quasi 4 anni da quando è stato pubblicato !!
LearningEveryday

14

Prova questo perché ti offrirà sia standard che prestazioni.

 $('#myDiv').click(function(){
      //Some code
 });

Poiché il secondo metodo è semplice codice JavaScript ed è più veloce di jQuery. Ma qui le prestazioni saranno approssimativamente le stesse.


11

IMHO, onclick è il metodo preferito rispetto a .click solo quando sono soddisfatte le seguenti condizioni:

  • ci sono molti elementi nella pagina
  • solo un evento da registrare per l'evento click
  • Sei preoccupato per le prestazioni mobili / la durata della batteria

Ho formulato questa opinione a causa del fatto che i motori JavaScript sui dispositivi mobili sono da 4 a 7 volte più lenti rispetto alle loro controparti desktop realizzate nella stessa generazione. Lo odio quando visito un sito sul mio dispositivo mobile e ricevo uno scrolling nervoso perché jQuery vincola tutti gli eventi a spese della mia esperienza utente e della durata della batteria. Un altro fattore di supporto recente, sebbene questo dovrebbe riguardare solo le agenzie governative;), abbiamo avuto IE7 pop-up con una finestra di messaggio che indica che il processo JavaScript sta impiegando molto tempo ... attendere o annullare il processo. Questo è successo ogni volta che c'erano molti elementi a cui legarsi tramite jQuery.


10

Differenza nelle opere. Se si utilizza click (), è possibile aggiungere diverse funzioni, ma se si utilizza un attributo, verrà eseguita solo una funzione, l'ultima.

DEMO

HTML

<span id="JQueryClick">Click #JQuery</span> </br>
<span id="JQueryAttrClick">Click #Attr</span> </br>

JavaScript

$('#JQueryClick').click(function(){alert('1')})
$('#JQueryClick').click(function(){alert('2')})

$('#JQueryAttrClick').attr('onClick'," alert('1')" ) //This doesn't work
$('#JQueryAttrClick').attr('onClick'," alert('2')" )

Se parliamo di prestazioni, in ogni caso l'utilizzo diretto è sempre più veloce, ma utilizzando un attributo, sarai in grado di assegnare una sola funzione.


Possiamo eseguire più di una funzione usando l'attributo come $ ('# JQueryAttrClick'). Attr ('onClick', "alert ('2'); alert ('3'); alert ('4')")
Kira

8

La separazione delle preoccupazioni è la chiave qui, e quindi l'associazione di eventi è il metodo generalmente accettato. Questo è fondamentalmente ciò che molte delle risposte esistenti hanno detto.

Tuttavia , non buttare via l'idea del markup dichiarativo troppo rapidamente. Ha il suo posto, e con quadri come Angularjs, è il fulcro.

È necessario comprendere che il tutto è <div id="myDiv" onClick="divFunction()">Some Content</div>stato vergognato così pesantemente perché è stato abusato da alcuni sviluppatori. Quindi ha raggiunto il punto di proporzioni sacrileghe, molto simili tables. Alcuni sviluppatori in realtà evitano i tablesdati tabulari. È l'esempio perfetto di persone che agiscono senza capire.

Anche se mi piace l'idea di mantenere il mio comportamento separato dalle mie opinioni. Non vedo alcun problema con il markup che dichiara ciò che fa (non come lo fa, è un comportamento). Potrebbe essere sotto forma di un vero attributo onClick o di un attributo personalizzato, proprio come i componenti javascript di bootstrap.

In questo modo, guardando solo il markup, puoi vedere cosa fa, invece di provare a invertire i raccoglitori di eventi javascript di ricerca.

Pertanto, come terza alternativa a quanto sopra, utilizzare gli attributi dei dati per annunciare in modo dichiarativo il comportamento all'interno del markup. Il comportamento è tenuto fuori dalla vista, ma a prima vista puoi vedere cosa sta succedendo.

Esempio Bootstrap:

<button type="button" class="btn btn-lg btn-danger" data-toggle="popover" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</button>

Fonte: http://getbootstrap.com/javascript/#popovers

Nota Il principale svantaggio del secondo esempio è l'inquinamento dello spazio dei nomi globale. Ciò può essere aggirato utilizzando la terza alternativa sopra, oppure framework come Angular e i loro attributi ng-click con ambito automaticamente.


4

Nessuno dei due è meglio in quanto possono essere utilizzati per scopi diversi. onClick(in realtà dovrebbe essere onclick) leggermente migliore, ma dubito fortemente che noterai una differenza lì.

Vale la pena notare che fanno cose diverse: .clickpossono essere associati a qualsiasi raccolta jQuery mentre onclickdeve essere utilizzato in linea sugli elementi a cui vuoi che sia associato. Puoi anche associare un solo evento all'utilizzo onclick, mentre .clickti consente di continuare a associare gli eventi.

A mio avviso, sarei coerente a riguardo e userei .clickovunque e manterrei tutto il mio codice JavaScript insieme e separato dal codice HTML.

Non usare onclick. Non c'è motivo di usarlo se non sai cosa stai facendo, e probabilmente non lo sai.


2
Anche se "meglio" non è esplicitamente definito, non è quasi mai una buona idea inserire direttamente i gestori di eventi nel markup
Jay,

@Jayraj quando mai ho detto nella mia risposta che era una buona idea?
Pillole di esplosione il

3
Dicendo che .clicknon era meglio di onclick("Nessuno dei due è meglio ") era implicito che onclickè quasi, o altrettanto buono, un modo per scrivere codice, quando in realtà .clickè la migliore pratica di un miglio. Scusa, ma IMHO dovresti riformulare la tua risposta
Jay,

2
@ExplosionPills Vorrei rimuovere la parte della risposta che dice che nessuno dei due è migliore. Il paragrafo alla fine sembra una contraddizione.
Juan Mendes,

4
<whatever onclick="doStuff();" onmouseover="in()" onmouseout="out()" />

Gli eventi onclick, onmouseover, onmouseout, ecc. sono in realtà negativi per le prestazioni ( principalmente in Internet Explorer , vai in figura). Se si codifica utilizzando Visual Studio , quando si esegue una pagina con questi, ognuno di questi creerà un blocco SCRIPT separato che occupa memoria e quindi rallenta le prestazioni.

Per non parlare del fatto che dovresti avere una separazione delle preoccupazioni : JavaScript e layout dovrebbero essere separati!

È sempre meglio creare evenHandlers per uno di questi eventi, un evento può catturare centinaia / migliaia di elementi, invece di creare migliaia di blocchi di script separati per ognuno!

(Inoltre, tutto ciò che tutti gli altri dicono.)


3

Bene, una delle idee principali dietro jQuery è quella di separare JavaScript dal cattivo codice HTML . Il primo metodo è la strada da percorrere.


3

Il più delle volte, i metodi nativi JavaScript sono una scelta migliore rispetto a jQuery quando le prestazioni sono gli unici criteri, ma jQuery fa uso di JavaScript e semplifica lo sviluppo. È possibile utilizzare jQuery in quanto non peggiora eccessivamente le prestazioni. Nel tuo caso specifico, la differenza di prestazioni è ignorabile.


2

Il primo metodo di utilizzo onclicknon è jQuery ma semplicemente Javascript, quindi non si ottiene il sovraccarico di jQuery. Il modo jQuery può essere espanso tramite i selettori se è necessario aggiungerlo ad altri elementi senza aggiungere il gestore eventi a ciascun elemento, ma come è ora è solo una domanda se è necessario utilizzare jQuery o meno.

Personalmente dal momento che stai usando jQuery mi atterrei con esso in quanto è coerente e disaccoppia il markup dallo script.


1
L'esempio jQuery è praticamente la stessa cosa document.querySelector('#something').addEventListener(...o simile in Javascript semplice, quindi non è questo il punto. Allo stesso modo è possibile rilevare eventi gorgoglianti da nodi figlio in Javascript, non solo con le scorciatoie jQuery. Il nocciolo della questione è che questi eventi dovrebbero essere nel controller (file delle definizioni di comportamento javascript) piuttosto che nella vista (sparsi qua e là nell'html, che richiedono funzioni variabili globali o peggio ancora, codice in linea).
NoBugs

2

Il primo metodo è preferire. Utilizza i modelli avanzati di registrazione degli eventi , il che significa che è possibile collegare più gestori allo stesso elemento. È possibile accedere facilmente all'oggetto evento e il gestore può vivere nell'ambito di qualsiasi funzione. Inoltre, è dinamico, ovvero può essere invocato in qualsiasi momento ed è particolarmente adatto per elementi generati dinamicamente. Non importa se usi jQuery, un'altra libreria o i metodi nativi direttamente.

Il secondo metodo, utilizzando attributi inline, richiede molte funzioni globali (che portano all'inquinamento dello spazio dei nomi) e mescola il contenuto / la struttura (HTML) con il comportamento (JavaScript). Non usarlo.

Non è possibile rispondere facilmente alla domanda su prestazioni o standard. I due metodi sono completamente diversi e fanno cose diverse. Il primo è più potente, mentre il secondo è disprezzato (considerato stile cattivo).


1

Funzione Onclick Jquery

$('#selector').click(function(){ //Your Functionality });

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.