- El artículo trata sobre cómo dominar la manipulación del Document Object Model (DOM) usando JavaScript vanilla.
- Enfatiza la importancia de entender la API del DOM del navegador para el desarrollo web, a pesar del uso de herramientas modernas como Angular, VueJS, React, Solid y Svelte.
- El autor ofrece una colección de recursos que incluye APIs básicas del navegador, ejemplos fáciles de entender, demostraciones en tiempo real, consejos y buenas prácticas, casos de uso reales y compatibilidad con navegadores modernos e Internet Explorer.
- Estos recursos están divididos en tres niveles: básico, intermedio y avanzado.
- El nivel básico incluye tareas como cambiar dinámicamente el favicon según la preferencia de esquema de color del usuario, calcular el tiempo de lectura de una página web y actualizar dinámicamente variables raíz de CSS.
- El nivel intermedio incluye tareas como quitar sangría en un área de texto usando la combinación de teclas Shift+Tab, entrar en modo de pantalla completa y construir un campo numérico con controles.
- El nivel avanzado incluye tareas como crear un cursor personalizado, sanear cadenas HTML y crear una barra de desplazamiento personalizada.
- El autor también ofrece consejos como evitar que el diseño se desplace al abrir un modal y obtener el rectángulo delimitador de nodos de texto.
- El artículo termina con una invitación a suscribirse al boletín del autor sobre contenido técnico de frontend.
1 comentarios
Opiniones de Hacker News
La lista de ejemplos es excelente, y con solo revisar unos cuantos ya sorprenden el cuidado y detalle
A menudo, al pasar a implementaciones más pequeñas y minimalistas desde plataformas como React, uno se traba con cómo manejar patrones complejos con JS estándar, pero al ver el código a veces piensa: “esto es mucho más fácil que pasarle montones de props a una librería gigantesca”
Incluso los frameworks JS minimalistas, cuando se les acumulan pedidos de funciones que parecen inocentes, terminan convirtiéndose fácilmente en monstruos de hooks, eventos y parches de efectos secundarios
Hoy en día ni siquiera uso jQuery, y cosas como los módulos ES las uso para organizar el código, pero no hace falta andar ejecutando comandos de npm. Esto no es algo que haya que traer como vendor, es un estándar global del navegador
Últimamente veo MDN como si fuera la biblia. Si te guías por ahí, casi siempre te lleva hasta el final, y a partir de cierto punto los frameworks más bien empiezan a estorbar. Hace 5 años no era tanto así, pero las API de navegador convergieron rápido hacia piezas base potentes y consistentes como módulos, flexbox y grid
Por ejemplo, la mayoría de los ejemplos del artículo original son código que de todos modos tendrías que escribir incluso si usaras React
Como proyecto paralelo estoy haciendo algo aún sin nombre, una especie de “vim para diseñadores web”. Permite crear sitios web o componentes en el navegador, como Webflow, pero todo funciona con un lenguaje de comandos
Al principio decidí hacerlo sin framework. Llevo en esto desde 2009 y ya usaba JS desde mucho antes de tocar frameworks, así que pensaba que con la API DOM nativa bastaba
Pero mover datos dentro y fuera del DOM era tan aburrido y propenso a errores que, por salud mental, terminé usando un mini framework hecho por mí. Ahí recordé por qué había empezado a usar frameworks en primer lugar. Al final siempre terminas usando algún tipo de framework; la diferencia es si es uno hecho a la medida por ti o un estándar de la industria hecho por la comunidad
Para sitios con poca interacción, el DOM nativo está bien, y muchos sitios que usan React en realidad quizá no lo necesitan. Pero si el producto tiene aunque sea un poco de matiz o complejidad, preferiría usar un framework y evitarme la lata. Al final me pasé a Svelte y quedé mucho más satisfecho
Para un sitio web con interacción, manipular el DOM puede ser una mejor opción porque usa una técnica más fundamental y universal, tiene un proceso de build más ligero o inexistente, ejecuta más rápido y es más explícito
Claro, hay mucha zona gris, pero este caso cae exactamente en la categoría donde un framework sí aporta ventaja
value.startsWith('javascript:')por sí solo deja una vulnerabilidad. Puede haber espacios en blanco arbitrarios antes de la URL, así que como mínimo hace faltavalue.trim().startsWith('javascript:')Aun así, me parece mejor una lista de permitidos que una lista de bloqueados. Permitiria solo
http:,https:y, si hace falta, algo comomailto:,ftp:ysftp:. Quizá también se podrían permitir URLs relativas que empiecen con/Pero como al final hay que tratar correctamente todos los atributos que realmente pueden contener URLs, probablemente sea mejor permitir solo ciertos tags y sus atributos
['http:', 'https:', 'mailto:', 'tel:'].includes(new URL(value, location.origin).protocol)[1] https://caniuse.com/url
Este artículo no debería dar la impresión de que la sanitización de HTML es así de fácil. Al final menciona https://github.com/cure53/DOMPurify, pero creo que debería decir con mucha más fuerza que no hay que intentar escribir esto por cuenta propia y recomendar únicamente DOMPurify
Abrí un issue sobre este tema: https://github.com/phuocng/html-dom/issues/281
Parece una lista útil para tener a mano; no la vi completa, pero hasta ahora se ve bien
Al entrar al primer ejemplo, vi que ejecuta
window.matchMedia('(prefers-color-scheme: dark)')dos veces sin necesidadSi vas a usar
setFaviconcomo callback del event listener, puedes usarevent.matchesdel parámetroeventque recibe el callbackPersonalmente, me parece mejor manejarlo desde HTML. Así también se da soporte a quienes tienen JS desactivado
https://phuoc.ng/collection/html-dom/change-the-favicon-dyna...
theme-color, y para los desarrolladores de PWA que cuidan los detalles es una gran función, aunque no se use mucho todavíaLa técnica de “autoexpansión de
textarea” está quedando obsoleta por la nueva propiedad CSS form-sizinghttps://chriscoyier.net/2023/09/29/css-solves-auto-expanding...
Incluso sin usar esta nueva propiedad CSS, el enfoque de ajustar la
heightdel elemento no es ideal y puede trabarseUn mejor enfoque es usar un elemento espejo oculto
https://css-tricks.com/the-cleanest-trick-for-autogrowing-te...
Bastantes de las cosas que hay aquí usan APIs viejas e incómodas aunque existen APIs nativas mejores
Por ejemplo, “reemplazar un elemento” aparece como
ele.parentNode.replaceChild(newEle, ele);, pero si no apuntas a Chrome anterior a la 54, Firefox anterior a la 49 o Safari anterior a la 10, puedes simplemente usarele.replaceWith(newEle)replaceWith también permite reemplazar un nodo por varios nodos o texto
Del mismo modo, para “recorrer un NodeList” se sugiere expandirlo a un arreglo y luego usar
forEach, pero basta confor (let ele of nodelist) ...Está bueno. Lo guardé en marcadores. Como recurso similar también está https://youmightnotneedjquery.com/
No hago trabajo web muy seguido, pero cada vez que me toca, el exceso de frameworks me quita por completo las ganas. Que un proyecto nuevo de React arranque con cientos de dependencias ya está fuera de control, y el peso de esa complejidad sorprende
En cambio, las tecnologías de navegador multiplataforma incluidas por defecto son más potentes que nunca, y la cantidad de código para tareas comunes tampoco es tanta
¿Desarrolladores frontend, están bien?
Por ejemplo, la gestión del estado de la aplicación y el enrutamiento son partes grandes que, usando solo la API DOM pura, tendrías que implementar por tu cuenta
Según la complejidad de la app, puede que no sea gran cosa, pero en cuanto pasas de una app básica, el valor de esas funciones extra crece rápido. Eso sí, si usas algo que necesita NPM, se vuelve un dolor de cabeza
Como desarrollador frontend al que le gusta la plataforma base y sus capacidades, da gusto ver llegar cosas buenas como CSS anidado, las container queries y, en general, la experiencia de JS mejorada desde ES6
Al mismo tiempo, me sorprende que demasiada gente use componentes incluso para cosas tan triviales como un botón o texto en negrita
Me gustan los frameworks en sí, pero el marketing de muchos frameworks y librerías se apoya en la creencia de que CSS y la manipulación pura del DOM son absurdamente difíciles, y que traer cualquier paquete desde NPM no solo es más rápido y fácil, sino también un trabajo profesional
Solo con cosas como Kubernetes, Helm, Terraform y CircleCI, la cantidad de jerga apilada en capas es absurda
Me sorprendió muchísimo cuando supe que varias funciones del DOM devuelven una HTMLCollection viva que se actualiza automáticamente
Me pregunto qué tanto se usó activamente esta función en código real de producción antes del auge de los frameworks, o alrededor del pequeño resurgimiento de desarrollar otra vez sin frameworks
Lo viejo vuelve a ser nuevo. Mi primer puesto de frontend fue creando aplicaciones web en 1999
Incluso funciones elegantes como arrastrar y soltar en tree views, editar al hacer clic y apps que eran prácticamente de una sola página las hice todas con JS “Vanilla”
La parte más difícil era lidiar con las diferencias entre Netscape e Internet Explorer
¿Por qué ahora parece que no supiéramos cómo hacer eso? ;]
Mi función favorita de JavaScript puro últimamente es Element.insertAdjacentHTML, que existe desde la era de Chrome 1.0 e IE
Sobre todo junto con cadenas multilínea usando backticks, se queda corto decir que es útil. No puedo creer que, llevando tanto tiempo ahí, recién me enteré hace como un año
insertAdjacentHTML(position, text)analiza el texto indicado como HTML o XML e inserta los nodos resultantes en la posición especificada del árbol DOMSolo con el DOM tradicional, tenías que crear el elemento
li, crear el elementoa, añadirlo como hijo, configurar el atributohref, poner el valor de texto y luego insertarlo en elul. O si no, juntarlo todo en una cadena grande y meterlo coninnerHTML, y modificar una lista existente era todavía más doloroso y verboso