- jQuery 4 alinea el seu sistema d'esdeveniments amb els estàndards moderns, mantenint .on() com a API central i reforçant la previsibilitat del flux d'esdeveniments.
- La delegació d'esdeveniments i l'ús de selectors simples segueix sent claus per al rendiment, especialment en interfícies extenses o dinàmiques.
- El suport de Trusted Types i CSP fa que jQuery 4 encaixa millor en entorns amb forts requisits de seguretat sense renunciar a la seva ergonomia.
- Per a aplicacions existents, dominar el nou model d'esdeveniments de jQuery 4 permet modernitzar sense reescritures massives, mentre que els nous projectes poden recolzar-se a les API natives.

jQuery 4 arriba amb un sistema d'esdeveniments molt més alineat amb els estàndards moderns del navegador, però sense renunciar a la filosofia clàssica de la llibreria: escriure menys, fer més. Si mantenen les aplicacions amb bastant codi jQuery, entendre bé com han evolucionat els esdeveniments és clau per a les vostres interfícies que són ràpides, predecibles i fàcils de depurar.
En el fons, el sistema d'esdeveniments de jQuery 4 no és un simple envoltori d'addEventListener, sinó que permet normalitzar els comportaments entre els navegadors, reforçar la seguretat, mantenir un ordre d'execució clar i ofereix eines potents com la delegació d'esdeveniments i la integració amb les API modernes del navegador. Vamos a desgranar tot això amb calma, des de la base dels esdeveniments en JavaScript fins que realment canvia en aquesta versió.
JavaScript com a llenguatge dirigit per esdeveniments
JavaScript s'executa en un únic hilo, però l'entorn del navegador està completament dominat pels esdeveniments: clics de ratón, moviments, pulsacions de teclat, càrrega de recursos, canvis en formularis, etc. Cada una d'aquestes accions genera una senyal discreta associat a un nodo concret del DOM.
Un esdeveniment no és algo global que ocorre en tota la interfície, sinó que es dispara sempre sobre un element específic. Un clic sobre un botó dispara un esdeveniment clic sobre aquest botó, no sobre el document entero. A aquest esdeveniment podeu associar una funció manejadora (event handler) que s'executarà quan el navegador processi aquest succés.
Com el motor de JavaScript sol processa una instrucció a la vegada, fa falta una cola de tareas per coordinar els esdeveniments. Quan ocorre algo interessant —per exemple, l'usuari pulsa una tecla— el navegador col·loca aquest esdeveniment en una cua de distribució (cola de despacho). En quant la pila de trucades queda lliure, el motor pren el següent esdeveniment de la cola, executa el manejador associat fins al final i només llavors torna a mirar si hi ha més esdeveniments pendents.
Un detall sutil però important és que un esdeveniment sol entra a la cola si existeix al menys un manejador registrat per a ell. Si no hi ha ningú escoltant, el navegador simplement busca el succés. Això explica per quina interfície pot semblar “muerta” si volem registrar un listener per a la interacció que esperem.
Aquesta arquitectura deriva la trucada “regla de la capacitat de resposta”: com el hilo principal està ocupat mentre corre el teu manejador, si tarda massa, tot el lloc sembla congelat. Les animacions es paran, els clics semblen no respondre i l'experiència d'usuari cae en picat.
La estrategia correcta en JavaScript és fer que cada manejador faci el menor treball possible i devuelva el control quant abans. Si necessitas molt temps de CPU (per exemple, per processar un set de dades grans), convé trobar el treball en tareas petites —de decenas de milisegundos— i distribuir-les amb setTimeout, requestAnimationFrame o workers, de forma que el navegador pugui processar altres esdeveniments entre mitjans.
Esdeveniments en HTML puro i addEventListener

Abans d'entendre què aporta jQuery 4, convé repassar com se manejan esdeveniments amb JavaScript natiu. HTML permet definir manejadors en atributs on*, com onclick="miFuncion()” en un botó, però aquesta aproximació mescla estructura (HTML) amb comportament (JS) i fa el codi difícil de mantenir.
La forma moderna és utilitzar addEventListener directament sobre els nodos del DOM. Per exemple, un botó pot registrar diversos manejadores per al mateix tipus d'esdeveniment:
En aquest model, el primer argument de addEventListener és el tipus d'esdeveniment com a cadena —click, mouseover, keydown, etc.— i el segon és una referència a la funció. Segons l'especificació, si registres diversos oients, haurien d'executar-se en l'ordre en què se'ls añadieron, encara que en els entorns antics no sempre ha estat fiable fiarse d'aquest matiz per a la crítica lògica.
Una altra avantatge de l'API nativa és que podeu afegir més d'un manejador al mateix origen de l'esdeveniment. És totalment vàlid tenir una funció per guardar dades i una altra independent per a registrar analíticas, amb desaparèixer pel mateix clic. Esto ajuda a separar responsabilitats sense acoplar funcionalitats que no tenen per què estar mesclades.
El problema històric és que no tots els navegadors implementaven els esdeveniments exactament igual. Internet Explorer usava antigament attachEvent al lloc d'addEventListener, alguns esdeveniments no s'havien produït on hauríeu, i alguns detalls com l'ordre de focus i el desenfocament variaven. Aquest caos de compatibilidad és una de les raons per les que jQuery es va fer tan popular: ofrecía una capa uniforme per sobre de totes aquelles rareses.
El sistema d'esdeveniments de jQuery i el mètode .on()
Des de jQuery 1.7 i consolidat en jQuery 4, el cor del sistema d'esdeveniments de la llibreria és el mètode .on(). Tot i que hi ha ajudes com click(), hover() o bind(), per baixar tot acaba delegant en .on(), que és l'API unificada per registrar listeners.
.on() accepta diverses combinacions d'arguments que permeten des del cas simple fins a escenaris complexosEl patró més bàsic és:
En aquesta firma, el primer paràmetre és una cadena amb un o diversos tipus d'esdeveniments separats per espais, el segon és el manejador. jQuery invocarà aquesta funció cada vegada que l'acció ocorre en els elements seleccionats, passant sempre un objecte d'esdeveniment normalitzat.
La veritable potencia de .on() apareix quan s'aixeca un selector intermedi per fer la delegació d'esdeveniments. En aquest cas, la forma general és:
Quan utilitzem aquesta variant, el manejador no s'adjunta directament a cada element fill, sinó a un ancestre comú. jQuery aprofita el bubbling del DOM: l'esdeveniment s'origina en l'element objectiu, s'assenyala pels seus pares i, quan s'aconsegui el nodo donde se hizo .on(), es comprueba si event.target coincide amb el selector delegat. Si coincideix, s'executa el handler.
A més, .on() pot rebre un objecte on les claus son cadenes d'esdeveniments i els valors son funcions. Això permet registrar diversos oients d'una sola vegada sobre els mateixos elements, mantenint el codi més compacte i expressiu.
Aquest disseny té una altra cara interessant: podeu passar dades estàtics al registre de l'esdeveniment utilitzant les dades de paràmetre. jQuery encapsula aquesta informació en event.data cada vegada que dispara el manejador, el que facilita reutilitzar una mateixa funció amb comportaments ligerament diferents sense tenir que crear tancaments ad hoc.
L'objecte d'esdeveniment de jQuery i control del flux
Siempre que jQuery executa un manejador, passa com a argument per a un objecte d'esdeveniment propi que normalitza les diferències entre els navegadors. Aquest objecte inclou la informació essencial: el tipus d'esdeveniment en event.type, l'element on es va originar en event.target i una referència a l'esdeveniment natiu en event.originalEvent.
De manera predeterminada, la majoria dels esdeveniments del DOM es propaguen cap a dalt des de l'element original fins al document. En cada pas, jQuery comprueba quins manejadors coincideixen i els executaven en l'ordre en què van ser registrats. Aquest comportament és possible tant la delegació com la composició de funcionalitats sobre el mateix succés.
Si voleu detener la propagació per a l'esdeveniment no subiendo a l'arbre DOM, podeu llamar a event.stopPropagation(). Amb això, evita que altres elements ancestrals reciban la notificació i actúen en conseqüència, algo molt útil quan no desitgi que la lògica genèrica del contingut s'apliqui en un cas particular.
Hi ha un segon nivell de control amb event.stopImmediatePropagation(). A més de frenar el bubbling, aquesta trucada impedeix que s'executen altres manejadores del mateix tipus registrats en el mateix element. És una mesura més drástica per garantir que cap altra funció interfiera en un flux crític.
Per un altre costat, event.preventDefault() cancel·la l'acció pel defecte associat a l'esdeveniment. Per exemple, eviteu que un enllaç navegui a una altra URL o que un formulari us envieu. Aquesta tècnica és fonamental en els patrons com l'enviament per AJAX, on vulguis capturar el submit, anul·lar el comportament estàndard i llançar la teva pròpia petició aixíncrona.
Un ataxo clàssic de jQuery és devolver false des del manejador. Aquesta devolució equival a invocar tant preventDefault() com a stopPropagation(), combinant la cancel·lació de l'acció per defecte amb el bloqueig de la propagació. És còmode, però convé utilitzar-lo sol quan realment necessitis les dues coses a la vegada.
En el context de jQuery, la paraula clau this dins del manejador apunta a l'element al que se li està entregant l'esdeveniment en aquest moment. En esdeveniments directors, suele ser el nodo en el que es va registrar el listener; en delegats, serà un element que coincide amb el selector delegat, que no pot coincidir amb event.target si el succés burbujeó des d'un descendent profundo.
Passeu dades als manejadors i reutilitzar-los
jQuery permet enriquecer la informació de l'esdeveniment adjuntant dades arbitraris en el registre amb .on(). Si proporciona un tercer paràmetre de dades que no sea null ni undefined, jQuery s'insereix en event.data cada vegada que el handler s'executa.
La recomanació habitual és utilitzar un objecte pla com a contenidor, per exemple { action: “save”, tracking: true }, ja us permet agrupar diversos valors sota un mateix paràmetre i accedir-hi per propietats. Això fa el codi més llegible per passar una cadena simple.
Des de les versions anteriors a jQuery 4, un mateix manejador pot lligar-se diverses vegades al mateix element. Cada vincle pot dur a terme el seu propi paquet d'event.data, de manera que la mateixa funció actua de forma ligerament diferent segons el context amb el qual es va registrar. És una manera elegant d'aplicar el principi DRY en la lògica d'esdeveniments.
A més de les dades estáticos, jQuery ofereix un altre canal per passar informació dinàmica a diferents esdeveniments de forma manual. Els mètodes .trigger() i .triggerHandler() accepten un segon argument que pot ser un valor simple o un array; jQuery transformarà aquest valor o cada element de l'array en paràmetres addicionals del manejador, just després de l'objecte de l'esdeveniment.
Quan combines event.data i els arguments de .trigger(), aconsegueix un sistema molt flexible per construir APIs internes basades en esdeveniments. Podeu utilitzar event.data per a la configuració de la fija del listener i els paràmetres addicionals per a les dades variables en cada invocació programàtica.
Delegació d'esdeveniments: rendiment i escalabilitat
Una de les tècniques més poderoses del sistema d'esdeveniments de jQuery és la delegació, que es recolza directament en el bubbling del DOM. En lloc d'adjuntar un listener a cada element potencialment interactiu, el registre una sola vegada en un contingut comú i deixa que l'esdeveniment ascienda fins a ell.
Aquest patró brilla en estructures grans o dinàmiques. Imagina una taula amb mil celdas: registrar mil handlers individuals per gestionar un clic en cada una és una sobrecàrrega notable, tant per la memòria com pel treball de comparació al disparar els esdeveniments. En canvi, si col·loca un sol listener a la taula o en el cos i filtra pel selector adequat, reduce drásticament el cost.
La delegació també simplifica la interacció amb el contingut que es genera o modifica mitjançant AJAX. Si afegeixes noves files a la taula després de carregar la pàgina, no necessites tornar a recorrer el DOM per a adjuntar manejadores a cada celda recién creada: el listener delegat seguirà funcionando perquè escolta en l'ancestre, no en els nodos concrets.
Això sí, per mantenir un rendiment òptim conviene seleccionar amb cura el punt on s'adjunta l'esdeveniment delegat. Quant més amunt en l'arbre apel·les, més llarg serà el camí de burbujeo i major el nombre de comparacions de seleccionadors que jQuery ha de fer. En documents grans, utilitzar document o cos com a delegats universals pot ser costos per a successos d'alta freqüència.
En termes de selectores, jQuery processa molt ràpid patrons simples de la forma tag#id.class. Expressions com #myForm, a.external o button s'avaluen amb molta eficiència. En canvi, selectores jerárquicos complexos —per exemple, combinacions profundes de descendents— poden ser diverses vegades més lents, encara que en la majoria d'aplicacions segueixen sent perfectament utilitzables.
Hi ha que tenir en compte també que no tots els esdeveniments són aptos per a la delegació. Alguns, com load, scroll o error en imatges, no burbujean en els navegadors, i per tant només funcionen si els adjunts directament a l'element d'origen. jQuery introdueix esdeveniments com focusin i focusout per oferir alternatives que si burbujean a focus i blur, però hi ha categories —per exemple, certs esdeveniments de formulari en IE antics— on la delegació té limitacions històriques.
Rendiment d'esdeveniments en jQuery 4
En la majoria de casos, els esdeveniments com a clic o canvi es produeixen amb poca freqüència, de manera que el rendiment no és un problema.. Sense embargo, existeixen tipus molt ruidosos —mousemove, scroll, resize— que poden disparar-se docenas de vegades per segon, i ahí sí que mereix la pena ser cuidat amb la quantitat i el cost dels vostres manejadors.
La primera regla per a aquests esdeveniments d'alta freqüència és minimitzar el treball del callback. Convé precalcular i cachear valors que es repitan molt, limitar les operacions sobre el DOM i, quan sigui necessari, introduir tècniques de throttling o debouncing amb setTimeout, requestAnimationFrame o llibreries auxiliars, i controlar el comportament del scroll amb la desbordament de propietat CSS.
Un segon aspecte a vigilar és el nombre de manejadors delegats registrats a prop de l'arrel del document. Cada vegada que es dispara un esdeveniment, jQuery té que recuperar tots els oients potencials per a aquest tipus, recorrer la cadena d'ascens des del target fins al nodo raíz i comprovar els seleccionadors associats. Un excés de handlers genéricos anclats en document pot convertir-se en un cuello de botella.
La solució passa per anunciar la delegació més a prop possible dels elements objectius. Si saps que només t'interessen els esdeveniments en un formulari concret, és millor delegar en aquest formulari que en el cos. D'aquesta manera, el nombre d'elements per als que burbujea l'esdeveniment és menor i el cost d'avaluació es reduirà.
jQuery 4 manté la filosofia d'accelerar els selectors senzills utilitzats en delegació. Quan s'encaix, un selector com a botó dins d'un contingut específic serà notablement més eficient que expressions profundament antigues. A menudo basta con replantear dónde col·loca el listener per simplificar molt el selector necessari.
Compatibilitat d'esdeveniments, casos especials i notes importants
El sistema d'esdeveniments de jQuery es recolza en poder associar metadades interiors als elements del DOM. Això permet a la llibreria llevar un registre detallat de quins manejadors estan adjuntos a cada nodo, gestionar namespaces, suportar .off() de forma precisa, etc.
Existeixen també particularitats amb certs tipus d'esdeveniment segons el navegador. En tots, load, scroll i error en imatges no burbujean, així que no podràs delegar-los; en Internet Explorer 8 i anteriors, tampoc no ho hacían paste ni reset. Encara que jQuery intenta proporcionar alternatives compatibles, aquests límits del model d'esdeveniments del navegador segueixen aquí.
Un cas conegut és window.onerror, el contracte d'arguments i valor de retorn és diferent als esdeveniments estàndard. Per això jQuery no ho abstrae a través del seu sistema i recomana assignar el manejador directament sobre la propietat window.onerror quan necesites capturar errors globals.
Un altre matiz important és que la llista de manejadores que s'utilitzaran per a un element que es fija en el moment en què l'esdeveniment comença a processar-se. Si dins d'un callback llames a .off() per deixar un listener, aquest canvi no afectarà els handlers i programats per a l'execució actual: l'eliminació surtirà efecte sol en invocacions futures. Per tallar l'arrel, el resta de callbacks en el mateix element i el tipus d'esdeveniment al cicle actual, necessita stopImmediatePropagation().
En termes d'API, jQuery no ha deixat de ser poc clars com el pseudo-esdeveniment “hover” utilitzat com a àlies de mouseenter i mouseleave. En versions anteriors s'ha llegit a utilitzar “hover” com a nom agrupat, però això va causar confusió amb el mètode .hover(). En jQuery 4 s'enfatiza l'ús explícit de mouseenter i mouseleave o del mètode .hover() amb les seves dues funcions quan tingui sentit.
Què canvia realment en jQuery 4 respecte a esdeveniments
jQuery 4 marca un punt d'inflexió perquè redueix la seva dependència de comportaments heredats de navegadors antics. A nivell d'esdeveniments, això es traduirà en el model que segueix sent familiar però s'ajusta més estrictament a les especificacions actuals del DOM.
Uno dels canvis més adequats té que veure amb l'ordre i el maneig d'esdeveniments d'enfocament, com focus, blur, focusin i focusout. Històricament, jQuery va aplicar normalitzacions per aconseguir resultats consistents inclosos en navegadors amb implementacions peculiars. A la versió 4, la llibreria s'alinea més amb l'estàndard W3C, pel codi que dependrà de les particularitats de les velles podrien comportar-se de forma diferent.
Un altre aspecte clau és el retall de suport per a navegadors legacy. jQuery fa 4 anteriors Internet Explorer 10, Edge Legacy i mòbils molt antics, concentrant-se en una línia de base moderna. IE11 encara figura com a suportat, però tot apunta a que és un suport de transició. Al desaparecer la necessitat de solucions alternatives per a aquestes plataformes, el nucli d'esdeveniments pot ser més lleuger i directe.
Esta neteja va acompanyada d'una modernització interna del codi. La llibreria adopta patrons més propers al JavaScript actual, amb empaquetats millor integrats en eines com Vite, Rollup o webpack. Aunque esto no cambia directamente cómo llamas a .on() o .off(), sí afecta a cómo se resuelve jQuery en entorns modulares y bundlers modernos.
En el build slim, jQuery 4 recorda encara més. S'han eliminat Deferreds i Callbacks a favor d'utilitzar les Promises natives de JavaScript, el que s'encaixa millor amb l'ecosistema actual. Encara que això afecta a tot a la part d'asincronía i AJAX, també neteja fragments de codi històric que interactua amb esdeveniments de forma indirecta.
Aquest alineament amb els estàndards també refuerza la previsibilitat del sistema d'esdeveniments. En lloc de mantenir comportaments no estàndard per a la compatibilitat amb navegadors i obsolets, jQuery 4 aposta per respectar la semàntica definida pel W3C, el que facilita la raó sobre el flux d'esdeveniments, la propagació i l'ordre d'execució quan combina jQuery amb API natives modernes.
Seguretat, tipus de confiança i context d'esdeveniments
Un dels grans avenços de jQuery 4 està en el terreny de la seguretat, especialment en relació amb Content Security Policy (CSP) i Trusted Types. Encara que això no parés directament lligat als esdeveniments, la forma en què la llibreria interactua amb el DOM i el codi dinàmic sí influeix en la superfície d'atac.
Trusted Types és una tecnologia pensada per a atacs difícils de cross-site scripting (XSS) obligant a certs contextos sensibles (per exemple, assignatura innerHTML) rebre objectes especialment marcats com a segurs. jQuery 4 incorpora suport per a aquest mecanisme, el que facilita la integració en aplicacions que apliquen polítiques CSP estrictament.
Al alinear les seves operacions amb Trusted Types i CSP, jQuery redueix situacions en les que un simple manejador d'esdeveniments podria acabar introduint contingut insegur sense que et des del compte.. Això no elimina la necessitat de validar i sanear dades, però fa que la llibreria es comporta de forma més predecible en els entorns on la seguretat és una prioritat.
Des del punt de vista del desenvolupador de frontend, això significa que molts patrons clàssics basats en jQuery segueixen essent vàlids en aplicacions resistents., sempre que actualices a la versió 4 i s'adapti a les parts que depenen de les API deprecades. En torno als esdeveniments, això es traduirà en poder seguir utilitzant .on(), delegació i disparos programàtics sense xocar amb les proteccions modernes del navegador.
jQuery 4 davant de JavaScript natiu al maneig d'esdeveniments
Amb les API modernes del navegador —querySelector, addEventListener, fetch, classList— Molta gent es pregunta si jQuery segueix tenint el sentit. Tècnicament, podeu replicar la major part del que fa el sistema d'esdeveniments de la llibreria utilitzant només JavaScript natiu, i en projectes nous sols ser l'opció més raonable.
Sense embargo, en aplicacions existents amb molt codi jQuery, la història és diferent. Migrar de cop tot un sistema d'esdeveniments que depèn de .on(), delegacions, plugins i utilitats específiques poden ser caros i arriesgats. jQuery 4 ofereix la possibilitat de modernitzar la base sense tenir que reescriure de zero el model d'interacció.
En projectes greenfield o frameworks moderns, afegiu jQuery només per gestionar esdeveniments que no siguin necessaris. La combinació d'addEventListener amb patrons com a manual de delegació d'esdeveniments i utilitats lletres de tercers cobreixen tots els casos, amb un poc menys de màgia i més control explícit.
La decisió pragmàtica sol ser mantenir jQuery allí on ja està profundament integrat —per exemple, en CMS com WordPress o en aplicacions empresarials enormes— i escriure un codi nou natiu o amb frameworks on no hi hagi dependència heredada. En aquest escenari mixt, jQuery 4 actua com a punt entre el passat i el present del ecosistema web.
Per gestionar les bases del codi madures, comprendre el fons del sistema d'esdeveniments de jQuery 4 és una inversió útil: et permet extraer el màxim partit al que està escrit, aplicar millores de rendiment i seguretat, i planificar una possible migració progressiva a les API natives sense tenir que improvisar solucions a cada pas.
En l'última instància, jQuery 4 consolida un sistema d'esdeveniments que combina compatibilitat, claredat i alineació amb els estàndards. Si saps aprofitar bé .on(), la delegació, el control preciso de propagació i les millores en seguretat, pots seguir desenvolupant i mantenint interfícies basades en jQuery amb plena vigència en el context del frontend actual.