jQuery facilitó JavaScript con selección del DOM, eventos y AJAX sencillos. Aprende qué es, por qué decayó y cuándo aún tiene sentido hoy.

jQuery es una pequeña biblioteca de JavaScript que facilita tareas comunes en una página web: cosas como seleccionar elementos, reaccionar a clics, cambiar texto, mostrar/ocultar partes de la página y enviar peticiones al servidor.
Si alguna vez has visto código como $("button").click(...), eso es jQuery. El $ es simplemente un atajo para “encontrar algo en la página y hacer algo con ello”.
Esta guía es práctica y no técnica: qué es jQuery, por qué se volvió popular, por qué los proyectos más nuevos no lo usan tanto y cómo tratarlo si tu sitio todavía lo usa. Es intencionadamente más larga para incluir ejemplos claros y orientación del mundo real en lugar de opiniones rápidas.
Cuando la gente dice que jQuery está “olvidado”, normalmente no quiere decir que haya desaparecido. Quiere decir:
La historia no es “jQuery está muerto”. Es más bien: jQuery pasó de ser la herramienta por defecto para trabajo front-end a ser una dependencia heredada que puedes heredar—y que ocasionalmente aún eliges a propósito.
Antes de jQuery, el trabajo front-end a menudo significaba escribir los mismos pequeños y molestos trozos de código una y otra vez—y luego probarlos en múltiples navegadores y descubrir que se comportaban distinto. Incluso objetivos simples como “encontrar este elemento”, “adjuntar un manejador de clic” o “enviar una petición” podían convertirse en una pila de casos especiales.
Mucho del JavaScript temprano consistía menos en construir funciones y más en lidiar con el entorno. Escribías código que funcionaba en un navegador y luego añadías ramas extra para que funcionara en otro. Los equipos mantenían sus propias “mini bibliotecas” internas de funciones helper solo para sobrevivir a los cambios diarios de UI.
El resultado: desarrollo más lento, más errores y el temor constante de que un cambio mínimo rompiera un navegador antiguo del que dependían tus usuarios.
Los navegadores no coincidían en detalles importantes. Métodos de selección del DOM, manejo de eventos e incluso cómo obtener tamaños de elemento podían variar. Internet Explorer, en particular, tenía APIs distintas para eventos y solicitudes XMLHTTP, así que el código “estándar” no siempre era verdaderamente portable.
Eso importaba porque los sitios no se construían para un solo navegador. Si tu formulario de pago, menú de navegación o diálogo modal fallaba en un navegador popular, era un problema real de negocio.
jQuery se convirtió en un gran avance porque ofrecía una API consistente y amigable que suavizaba esas diferencias.
Hizo tareas comunes mucho más simples:
Igualmente importante, el estilo “write less, do more” de jQuery ayudó a los equipos a lanzar más rápido con menos sorpresas específicas de navegador—especialmente en una era en la que las “APIs DOM modernas” no eran tan capaces o soportadas ampliamente como ahora.
El verdadero superpoder de jQuery no fue inventar ideas nuevas, sino hacer que tareas comunes del navegador se sintieran consistentes y sencillas a través de distintos navegadores. Si lees código front-end antiguo, normalmente verás jQuery usado para cuatro trabajos cotidianos.
$)La función $() te permitía “agarrar” elementos usando selectores tipo CSS y luego trabajar con ellos como un grupo.
En lugar de lidiar con las peculiaridades de los navegadores y APIs verbosas, podías seleccionar todos los items, encontrar un hijo o subir al padre con llamadas cortas y encadenables.
jQuery hizo simple responder a acciones de usuario:
click para botones y enlacessubmit para formulariosready para ejecutar código cuando la página cargóAdemás suavizaba las diferencias en cómo los navegadores manejaban objetos de evento y el binding, lo cual importaba mucho cuando el soporte de navegadores era desigual.
Antes de que fetch() fuese estándar, $.ajax(), $.get() y $.post() de jQuery eran una forma directa de solicitar datos a un servidor y actualizar la página sin recargar.
Esto permitió patrones que hoy parecen normales: búsqueda en vivo, botones de “cargar más”, actualizaciones parciales de la página—usando una API única y familiar.
jQuery popularizó toques rápidos de UI como hide(), show(), fadeIn(), slideToggle() y animate(). Eran convenientes para menús, notificaciones y transiciones básicas—especialmente cuando el soporte de CSS era menos fiable.
Tomadas en conjunto, estas comodidades explican por qué el JavaScript legado a menudo empieza con $( y por qué jQuery fue herramienta por defecto durante tanto tiempo.
Mucha de la reputación de jQuery viene de lo poco que costaba en líneas hacer tareas comunes de UI—especialmente cuando las diferencias entre navegadores eran dolorosas. Un lado a lado rápido lo deja claro.
jQuery
// Select a button and run code when it's clicked
$('#save').on('click', function (e) {
e.preventDefault();
$('.status').text('Saved!');
});
JavaScript moderno (vanilla)
// Select a button and run code when it's clicked
const saveButton = document.querySelector('#save');
const status = document.querySelector('.status');
saveButton?.addEventListener('click', (e) =\u003e {
e.preventDefault();
if (status) status.textContent = 'Saved!';
});
A primera vista, la versión jQuery se siente “más limpia”: una cadena selecciona el elemento, adjunta un manejador y actualiza texto. Esa compacidad fue un punto de venta importante.
JavaScript moderno es un poco más verboso, pero también más explícito:
querySelector y addEventListener te dicen exactamente lo que sucede.textContent es una propiedad DOM estándar (sin wrapper de biblioteca).?.) y comprobaciones de null dejan claro qué pasa si los elementos no existen.Depende del contexto. Si mantienes una base de código antigua que ya usa jQuery en todas partes, el snippet de jQuery puede ser más consistente y rápido de usar. Si escribes código nuevo, las APIs DOM modernas están ampliamente soportadas, reducen dependencias y son más fáciles de integrar con las herramientas y frameworks actuales.
Durante mucho tiempo la mayor ventaja de jQuery fue la previsibilidad. Podías escribir de una forma para seleccionar elementos, adjuntar eventos o hacer una petición Ajax—y funcionaba en la mayoría de sitios.
Con los años, los navegadores se estandarizaron y mejoraron. Muchas de las comodidades “imprescindibles” que jQuery agrupaba ahora están en JavaScript mismo, así que a menudo ya no necesitas una biblioteca extra solo para lo básico.
Los métodos DOM modernos cubren los patrones más comunes de jQuery:
document.querySelector() / document.querySelectorAll() reemplazan a $(...) para muchas selecciones.element.classList.add() / .remove() / .toggle() cubren manipulación de clases.element.addEventListener() reemplazó el wrapper de eventos de jQuery para la mayoría de casos.En lugar de recordar helpers específicos de jQuery, puedes confiar en APIs estándar que funcionan en navegadores modernos.
Donde $.ajax() solía ser la opción, fetch() ahora gestiona muchas peticiones diarias con menos ceremonia, especialmente con JSON:
const res = await fetch('/api/items');
const data = await res.json();
Aún necesitas gestionar errores y timeouts explícitamente, pero la idea central—hacer peticiones sin un plugin—es ahora nativa.
jQuery introdujo a mucha gente al código asíncrono vía callbacks y $.Deferred. Hoy, Promises y async/await hacen los flujos asíncronos más legibles, y los módulos ES dejan más claro cómo está organizado el código.
Esa combinación—APIs DOM modernas + fetch + características del lenguaje—eliminó gran parte de la razón original por la que los equipos recurrían por defecto a jQuery.
jQuery creció en la era de “sitios multipágina”: el servidor renderizaba HTML, el navegador cargaba la página y se añadían comportamientos—manejadores de clic, animaciones, llamadas AJAX—sobre el marcado existente.
Los frameworks modernos invirtieron ese modelo. En vez de mejorar páginas, las apps a menudo generan la mayor parte de la UI en el navegador y la mantienen sincronizada con los datos.
React, Vue y Angular popularizaron construir interfaces con componentes—pequeñas piezas reutilizables que gestionan su propio marcado, comportamiento y estado.
En este enfoque, el framework quiere ser la fuente de la verdad para lo que está en pantalla. Rastrean estado, re-renderizan partes de la UI cuando cambia el estado y esperan que expreses cambios de forma declarativa (“cuando X es true, muestra Y”).
jQuery, en cambio, fomenta manipulación imperativa del DOM (“encuentra este elemento, cambia su texto, ocúltalo”). Eso puede entrar en conflicto con el ciclo de renderizado de un framework. Si cambias nodos del DOM que un componente “controla”, el siguiente re-render puede sobreescribir tus cambios—o acabarás depurando inconsistencias.
A medida que las SPAs se volvieron comunes, los equipos adoptaron herramientas de construcción y bundlers (Webpack, Rollup, Vite). En lugar de añadir unas cuantas etiquetas <script>, importas módulos, empaquetas solo lo que usas y optimizas para rendimiento.
Ese cambio también hizo que la gente cuidara más las dependencias y el tamaño del bundle. Incluir jQuery “por si acaso” se sentía menos natural cuando cada kilobyte y cada actualización de terceros formaban parte del pipeline.
Se puede usar jQuery dentro de un framework, pero con frecuencia se convierte en una isla de casos especiales—más difícil de probar, más difícil de razonar y con más probabilidad de romperse durante refactors. Por eso muchos equipos eligieron patrones nativos del framework en lugar de scripting DOM al estilo jQuery.
jQuery en sí no es “enorme”, pero a menudo viene con equipaje. Muchos proyectos que dependen de jQuery también acumulan plugins (sliders, selectores de fecha, librerías de modal, validadores), cada uno añadiendo más código de terceros para descargar y parsear. Con el tiempo, una página puede acabar enviando utilidades superpuestas—especialmente cuando las funciones se añadieron rápidamente y nunca se revisaron.
Más JavaScript generalmente significa más tiempo para que el navegador lo obtenga, parse y ejecute antes de que la página sea usable. Eso se nota más en móviles, redes lentas y hardware antiguo. Aunque al final tus usuarios consigan una experiencia fluida, el “tiempo hasta usable” puede empeorar cuando la página espera scripts extra y sus dependencias.
Un patrón común en sitios de larga vida es una base de código “híbrida”: algunas funciones escritas con jQuery, partes nuevas con un framework (React, Vue, Angular) y unos pocos snippets en JavaScript puro. Esa mezcla puede confundir:
Cuando coexisten múltiples estilos, los cambios pequeños se vuelven más riesgosos. Un desarrollador actualiza un componente, pero un script jQuery antiguo sigue manipulando el mismo marcado y causa bugs difíciles de reproducir.
Los equipos se alejan de jQuery no porque “deje de funcionar”, sino porque los proyectos modernos optimizan para bundles más pequeños y propiedad clara del comportamiento UI. A medida que los sitios crecen, reducir código de terceros y estandarizar un enfoque suele facilitar afinaciones de rendimiento, depuración y onboarding.
jQuery no solo se hizo popular—se convirtió en por defecto. Durante años fue la forma más fácil de hacer interactividad fiable entre navegadores, así que quedó incrustado en plantillas, snippets, tutoriales y soluciones copy‑paste.
Una vez que eso ocurrió, jQuery se volvió difícil de evitar: incluso si un sitio solo usaba una pequeña característica, a menudo cargaba la librería completa porque todo lo demás asumía que estaba ahí.
Una gran razón por la que jQuery todavía aparece es sencilla: su éxito lo puso “en todas partes” en el código de terceros. Widgets UI antiguos, sliders, lightboxes, validadores de formularios y scripts de tema se escribieron comúnmente como plugins jQuery. Si un sitio depende de uno de esos componentes, eliminar jQuery puede requerir reescribir o reemplazar esa dependencia—no solo cambiar unas pocas líneas.
WordPress es una gran fuente de “jQuery legado”. Muchos temas y plugins—especialmente los creados hace años—usan jQuery para comportamiento front-end y, históricamente, las pantallas de administración de WordPress también dependían de él. Incluso cuando las versiones nuevas avanzan hacia JavaScript moderno, la larga cola de extensiones existentes mantiene jQuery presente en muchas instalaciones.
Los sitios antiguos suelen priorizar “no romper lo que funciona”. Mantener jQuery puede ser la opción más segura cuando:
En resumen, jQuery no siempre está “olvidado”—a menudo es parte de los cimientos sobre los que se construyó un sitio, y los cimientos no se cambian a la ligera.
jQuery no es “mala” software—simplemente ya no es tan necesaria como antes. Hay situaciones reales donde mantener (o incluso añadir) un poco de jQuery es la opción más práctica, especialmente cuando optimizas por tiempo, compatibilidad o estabilidad en lugar de pureza arquitectónica.
Si tus requisitos incluyen navegadores más antiguos (especialmente versiones antiguas de Internet Explorer), jQuery aún puede simplificar selección del DOM, manejo de eventos y AJAX de formas que las APIs nativas no igualan sin polyfills adicionales.
La pregunta clave es el coste: soportar navegadores legacy suele implicar enviar código extra de todos modos. En ese contexto, jQuery puede ser una parte aceptable del paquete de compatibilidad.
Si un sitio ya está construido alrededor de jQuery, pequeños cambios de UI suelen ser más rápidos y seguros cuando se hacen con el mismo estilo que el resto del código. Mezclar enfoques puede crear confusión (dos patrones para eventos, dos formas de manipular el DOM), lo que complica el mantenimiento.
Una regla razonable: si tocas una o dos pantallas y la app está por lo demás estable, parchear con jQuery está bien—solo evita expandir su uso a nuevos “sistemas” que luego tendrás que deshacer.
Para un sitio de marketing simple o una herramienta interna—sin bundler, sin transpiler, sin framework de componentes—jQuery sigue siendo un ayudante cómodo con “una sola etiqueta script”. Es especialmente útil si quieres unas pocas interacciones (menús toggle, comportamientos de formularios simples) y no deseas introducir un pipeline de compilación.
Muchos plugins maduros (selectores de fecha, tablas, lightboxes) se construyeron sobre jQuery. Si un plugin antiguo es crítico para el negocio y estable, mantener jQuery como dependencia puede ser la opción de menor riesgo.
Antes de comprometerte, comprueba si existe una alternativa mantenida sin jQuery—o si actualizar el plugin forzará una reescritura más amplia de lo que el proyecto puede asumir ahora.
Dejar jQuery no es tanto un gran rewrite como reducir la dependencia sin romper el comportamiento del que depende la gente. El enfoque más seguro es incremental: mantener las páginas funcionando mientras vas cambiando piezas por debajo.
Empieza respondiendo tres preguntas prácticas:
Esta auditoría te ayuda a evitar reemplazar cosas que no necesitas y a detectar dependencias “ocultas” como un plugin que usa $.ajax() en silencio.
La mayoría de equipos consigue victorias rápidas cambiando los patrones más simples:
$(".card") → document.querySelectorAll(".card").addClass() / .removeClass() → classList.add() / classList.remove().on("click", ...) → addEventListener("click", ...)Haz esto en PRs pequeños para que sean fáciles de revisar y revertir.
Si usas $.ajax(), migra esas llamadas a fetch() (o un pequeño helper HTTP) punto por punto. Mantén las mismas estructuras de respuesta para que el resto de la UI no tenga que cambiar de inmediato.
// jQuery
$.ajax({ url: \"/api/items\", method: \"GET\" }).done(renderItems);
// Modern JS
fetch(\"/api/items\")
.then(r =\u003e r.json())
.then(renderItems);
Antes de quitar jQuery, añade cobertura donde importa: flujos clave de usuarios, envíos de formularios y cualquier UI dinámica. Incluso comprobaciones ligeras (tests smoke con Cypress o una checklist de QA) pueden atrapar regresiones temprano. Lanza cambios detrás de una feature flag cuando sea posible y confirma que las métricas/errores se mantienen estables.
Si quieres seguridad extra durante refactors, ayuda usar herramientas que soporten snapshots y rollback. Por ejemplo, equipos que modernizan front ends legados a veces prototipan reemplazos en Koder.ai (una plataforma de codificación vía chat) y usan su flujo de snapshots/rollback para iterar sin perder una versión “conocida como buena”.
Si necesitas ayuda organizando el plan general, consulta /blog/jquery-vs-vanilla-js para una línea base comparativa que puedes usar durante refactors.
Migrar fuera de jQuery suele ser menos sobre “reemplazar sintaxis” y más sobre deshacer años de suposiciones. Aquí tienes las trampas que ralentizan a los equipos—y cómo evitarlas.
Un rewrite completo suena limpio, pero a menudo crea una rama de larga vida, muchas regresiones y presión por entregar trabajo incompleto. Un enfoque más seguro es incremental: reemplaza una función o página a la vez, mantiene el comportamiento idéntico y añade tests alrededor de las piezas que tocas.
Si introduces React/Vue/Svelte (o incluso un sistema ligero de componentes) mientras jQuery sigue manipulando los mismos nodos DOM, puedes tener un “tira y afloja” UI: el framework re-renderiza y sobreescribe cambios de jQuery, mientras jQuery actualiza elementos que el framework cree que controla.
Regla práctica: establece un límite claro. O bien:
Mucho código antiguo depende de eventos delegados como:
$(document).on('click', '.btn', handler)
El DOM nativo puede replicarlo, pero el matching y las expectativas sobre this/event.target pueden cambiar. Bugs comunes: manejadores que disparan por el elemento equivocado (por iconos/spans anidados) o que no disparan para elementos añadidos dinámicamente porque el listener se adjuntó al ancestro equivocado. Al reemplazar eventos delegados, confirma:
closest() suele ser necesario)Los efectos de jQuery UI y animaciones personalizadas a veces ocultaban problemas de accesibilidad por accidente—o los introducían. Al reemplazar fades, slides y toggles, vuelve a comprobar:
aria-expanded en botones de disclosure)prefers-reduced-motion)Detectar estas trampas temprano hace que tu migración sea más rápida y tu UI más fiable—incluso antes de que desaparezca el último $().
jQuery no es “malo”. Resolvío problemas reales—especialmente cuando los navegadores se comportaban de forma distinta y construir páginas interactivas implicaba escribir mucho código repetitivo. Lo que cambió es que normalmente ya no lo necesitas en proyectos nuevos.
Algunas fuerzas lo empujaron de “elección por defecto” a “dependencia heredada”:
Si mantienes un sitio antiguo, jQuery puede seguir siendo una herramienta razonable—especialmente para arreglos pequeños, plugins estables o páginas que no justifican una reescritura completa. Si construyes funciones nuevas, prioriza JavaScript nativo y mantiene jQuery solo donde claramente ahorra tiempo.
Para seguir aprendiendo con impacto práctico, continúa con:
Si evalúas cómo modernizar más rápido, considera herramientas que te permitan prototipar y desplegar de forma incremental. Koder.ai puede ser útil: describe el comportamiento que quieres en chat, genera una UI basada en React y un backend Go/PostgreSQL si hace falta, y exporta el código fuente cuando estés listo para integrar con una base existente.
Si evalúas opciones de herramientas o soporte, también puedes revisar alternativas aquí: /pricing
jQuery es una biblioteca de JavaScript que simplifica tareas comunes en el navegador como seleccionar elementos, manejar eventos, hacer peticiones Ajax y efectos básicos (mostrar/ocultar, desvanecimientos, deslizamientos). Su patrón distintivo es usar la función $() para encontrar elementos y encadenar acciones sobre ellos.
$ es simplemente una función abreviada (normalmente provista por jQuery) que busca elementos en la página —similar a document.querySelectorAll()— y devuelve un objeto jQuery sobre el que puedes encadenar métodos.
Si ves $() en código antiguo, normalmente significa “selecciona algo y luego haz algo con ello”.
Se hizo popular porque convirtió comportamientos inconsistentes entre navegadores en una API predecible. En los primeros tiempos, tareas simples como eventos, recorrido del DOM y Ajax requerían soluciones específicas por navegador.
jQuery ofreció una única API fiable para que los equipos pudieran entregar funciones más rápido y con menos sorpresas entre navegadores.
Principalmente porque los navegadores y JavaScript evolucionaron. Hoy en día a menudo puedes reemplazar tareas clásicas de jQuery con funcionalidades nativas:
querySelector / querySelectorAll para selecciónNo. Muchos sitios existentes todavía lo usan y sigue funcionando. “Legacy” suele significar que es más común en bases de código antiguas que en proyectos nuevos.
La pregunta práctica es si merece la pena mantenerlo según rendimiento, mantenimiento y las dependencias actuales (especialmente plugins).
Porque quedó integrado en ecosistemas antiguos —temas y plugins especialmente—. Un ejemplo típico es WordPress: muchas extensiones históricas asumen que jQuery está presente.
Si tu sitio depende de un plugin que sólo funciona con jQuery (sliders, pickers, lightboxes, validadores), eliminar jQuery suele implicar reemplazar ese plugin, no sólo cambiar unas líneas de código.
Sí, en varias situaciones prácticas:
En esos casos, la estabilidad y la rapidez pueden ser más importantes que reducir dependencias.
Comienza de forma incremental y mide el impacto:
La delegación de eventos es frecuente. Código jQuery como:
$(document).on('click', '.btn', handler)
en DOM nativo se puede replicar, pero hay que comprobar las expectativas sobre this/event.target. Errores comunes:
Sí—los efectos y reescrituras del DOM pueden romper la accesibilidad. Al reemplazar hide()/show() o animaciones, vuelve a comprobar:
aria-expanded, etc.)prefers-reduced-motion)classListaddEventListener para eventosfetch + async/await para peticionesPor eso los proyectos nuevos no suelen necesitar una capa de compatibilidad para lo básico.
$.ajax()fetch()PRs pequeños y despliegues escalonados reducen el riesgo de regresiones.
Al reemplazar eventos delegados, confirma qué elemento debe considerarse el “botón clicado” (closest() suele ser necesario) y cómo vas a eliminar listeners (no hay namespaces de evento nativos como en jQuery).
Mantener el mismo comportamiento no es solo visual; incluye interacción y flujo de teclado.