Proyecto 2 — Funcionalidades Interactivas con JavaScript
RA3 · JavaScript y Manipulación del DOM
Contexto del proyecto
En el proyecto anterior construiste la base de tu sitio web: la estructura HTML5 y la presentación con CSS3. El cliente ha quedado satisfecho con el resultado visual, pero ahora necesita que la web "cobre vida".
Has recibido una nueva solicitud: incorporar funcionalidades interactivas que mejoren la experiencia del usuario. El cliente quiere que los visitantes puedan interactuar con la página sin necesidad de recargarla: añadir y eliminar elementos, ver respuestas inmediatas al rellenar formularios, filtrar contenido, y disfrutar de una experiencia de compra o gestión dinámica.
Tu trabajo es implementar estas funcionalidades usando JavaScript moderno (ES6+), manipulando el DOM de tu sitio web ya existente.
Objetivo
Añadir interactividad a tu sitio web mediante JavaScript, implementando manipulación dinámica del DOM: creación, modificación y eliminación de elementos, gestión de estilos, y funcionalidades interactivas completas.
Requisitos del proyecto
1. JavaScript moderno (ES6+)
-
Usar let y const en lugar de var.
-
Aplicar arrow functions donde sea apropiado.
-
Usar template literals para generar HTML dinámico.
-
Aplicar desestructuración y spread/rest operators cuando sea necesario.
-
El código debe estar bien estructurado, indentado y comentado.
2. Manipulación del DOM
-
Seleccionar elementos con querySelector, querySelectorAll, getElementById y similares.
-
Crear y añadir nuevos elementos dinámicamente con createElement y appendChild.
-
Modificar contenido y atributos de elementos existentes.
-
Eliminar elementos del DOM con removeChild o remove(), verificando su existencia antes.
-
Manipular estilos con classList.add, classList.remove y classList.toggle.
3. Funcionalidades interactivas (obligatorias)
Las tres primeras funcionalidades forman una única feature coherente: un gestor de elementos del propio proyecto. Dependiendo del tipo de sitio web, puede ser un catálogo de productos, un portfolio de trabajos, una lista de servicios, un blog de entradas... El usuario puede añadir elementos mediante un formulario, verlos presentados visualmente y filtrarlos. Las tres partes son inseparables y trabajan juntas.
Gestor de elementos (funcionalidad principal): una sección donde el usuario puede añadir nuevos elementos a través de un formulario con validación en tiempo real, ver los elementos añadidos presentados en una galería o cuadrícula, y filtrarlos por categoría, estado u otro criterio que tenga sentido en el contexto del proyecto.
Esta funcionalidad principal debe implementar las tres mecánicas DOM de forma integrada:
-
Formulario con validación dinámica: campos obligatorios, mensajes de error o éxito visibles en tiempo real, sin recargar la página.
-
Galería o listado dinámico: cada elemento enviado por el formulario se crea y añade al DOM, y puede eliminarse individualmente.
-
Sistema de filtros: los elementos mostrados se pueden filtrar según uno o varios criterios (categoría, tipo, estado...).
Flujo libre: una funcionalidad adicional e independiente, coherente con el proyecto (modo oscuro, carrito de compra, sistema de valoraciones, contador de visitas, acordeón de FAQs, temporizador...).
4. Buenas prácticas de código
-
El código JavaScript debe estar en un archivo externo js/script.js.
-
Separación clara entre HTML, CSS y JavaScript (sin onclick="" en el HTML).
-
Sin uso de librerías externas (jQuery u otras). Solo JavaScript nativo.
-
El código debe funcionar sin errores en la consola del navegador.
Entregable
Actualizar el repositorio de GitHub con las siguientes incorporaciones:
| Elemento | Descripción |
|---|---|
| script.js | Archivo JavaScript ubicado en la carpeta js/ del proyecto, con todo el código de las funcionalidades. |
| README.md actualizado | Documentación de las decisiones técnicas tomadas y ejemplos de manipulación del DOM implementados. |
| GitHub Pages | Demo funcional y accesible desde el navegador a través de GitHub Pages o servidor equivalente. |
Evaluación — RA3
(RA3) Accede y manipula documentos web utilizando lenguajes de script de cliente.
Criterio 3.a — Se han identificado y clasificado los lenguajes de script de cliente relacionados con la web y sus diferentes versiones y estándares.
| Nota | Descripción | Indicador |
|---|---|---|
| 10 Excelente | Ha identificado y clasificado correctamente los lenguajes de script de cliente, explicando sus diferencias, usos y estándares. Ha justificado la evolución de JavaScript y su relación con ECMAScript (ES6+), relacionándolo con las decisiones tomadas en el proyecto. | Clasificación detallada con referencias a estándares, versiones y aplicación al proyecto. |
| 8 Notable | Ha identificado y clasificado los lenguajes de script mencionando estándares y versiones, aunque con algunas justificaciones poco detalladas. | Clasificación correcta, pero con explicaciones mejorables. |
| 6 Aprobado | Ha identificado los lenguajes de script y sus usos, pero con explicaciones superficiales sobre versiones y estándares. | Identificación básica sin profundizar en diferencias clave. |
| 4 Insuficiente | Ha intentado clasificar los lenguajes de script, pero con errores o sin referencia a estándares y versiones. | Clasificación poco clara o con información incorrecta. |
| 2 Deficiente | Ha presentado información muy limitada o incorrecta sobre los lenguajes de script. | Falta de comprensión sobre los lenguajes de script de cliente. |
| 0 No realizado | No ha presentado ninguna clasificación ni información. | Sin evidencia de trabajo. |
Buenas prácticas a evaluar:
-
Explicación clara de la clasificación de lenguajes de script.
-
Identificación de ECMAScript y sus versiones relevantes (ES6+).
-
Justificación del uso de JavaScript en el proyecto frente a otras alternativas.
-
Uso de ejemplos concretos del propio proyecto para ilustrar la clasificación.
Criterio 3.b — Se ha identificado la sintaxis básica de los lenguajes de script de cliente.
| Nota | Descripción | Indicador |
|---|---|---|
| 10 Excelente | Aplica correctamente la sintaxis moderna de JavaScript (ES6+) en todo el proyecto: let/const, arrow functions, template literals para generar HTML dinámico, y desestructuración. El código del gestor de elementos y del flujo libre es claro, eficiente y bien estructurado. | Sintaxis ES6+ coherente y consistente en todas las funcionalidades del proyecto. |
| 8 Notable | Usa mayoritariamente sintaxis moderna con pequeños errores o incoherencias. La funcionalidad es correcta y el código entendible. | Código funcional y organizado con pequeños detalles mejorables. |
| 6 Aprobado | Usa estructuras básicas con errores puntuales. El código funciona, pero no aprovecha las características modernas de ES6+. | Sintaxis tradicional con escaso uso de características modernas. |
| 4 Insuficiente | Uso inconsistente o incorrecto de estructuras sintácticas. El código es confuso o poco eficiente. | Presencia de errores frecuentes o mal uso de la sintaxis. |
| 2 Deficiente | Sintaxis incorrecta o uso incoherente del lenguaje. El código no se ejecuta correctamente. | Código no funcional. |
| 0 No realizado | No ha entregado código relacionado. | Sin evidencia. |
Buenas prácticas a evaluar:
-
Uso adecuado de let y const en lugar de var.
-
Template literals para construir el HTML dinámico de los elementos del gestor.
-
Arrow functions en callbacks de eventos.
-
Código indentado, con nombres de variables descriptivos y comentarios cuando sea necesario.
Criterio 3.c — Se han utilizado métodos para la selección y acceso de los diferentes elementos de un documento web.
| Nota | Descripción | Indicador |
|---|---|---|
| 10 Excelente | Emplea correctamente querySelector, querySelectorAll, getElementById y similares, adaptando el método al contexto: selección única del formulario, selección múltiple de los elementos del gestor, acceso a los controles de filtro. El código está bien organizado y es eficiente. | Selección coherente, eficiente y justificada en todas las partes del proyecto. |
| 8 Notable | Uso correcto de los métodos de selección en las distintas funcionalidades, aunque con algún margen de mejora en organización o eficiencia. | Selección adecuada con pequeños fallos. |
| 6 Aprobado | Selecciona elementos correctamente en la mayoría de casos, con algunos errores menores o redundancias. | Código funcional pero mejorable. |
| 4 Insuficiente | Métodos mal aplicados o confusos en alguna de las funcionalidades, lo que dificulta la interacción. | Código inconsistente en la selección de elementos. |
| 2 Deficiente | Selección errónea o sin relación clara con los elementos que se desean controlar. | Código no funcional. |
| 0 No realizado | No se han usado métodos de selección. | Sin evidencia. |
Buenas prácticas a evaluar:
-
Selección específica y clara: no seleccionar más de lo necesario.
-
Guardar referencias a elementos de uso frecuente en variables (no seleccionar en cada evento).
-
Uso de querySelectorAll para trabajar con el conjunto de elementos del gestor.
-
Relación clara y coherente entre los selectores CSS usados en el HTML y los usados en JavaScript.
Criterio 3.d — Se han creado y modificado elementos de documentos web.
| Nota | Descripción | Indicador |
|---|---|---|
| 10 Excelente | Implementa correctamente la creación dinámica de elementos en el gestor: cada envío del formulario genera un nuevo elemento en el DOM con toda su estructura (imagen, título, descripción, categoría, botón de eliminar...). Usa createElement, appendChild y template literals de forma eficiente. Los elementos creados son visualmente coherentes con el resto del diseño. | Creación dinámica fluida, estructurada y coherente con el diseño de la página. |
| 8 Notable | Crea elementos correctamente con detalles menores mejorables en estructura, atributos o reutilización de código. | Código funcional y bien distribuido. |
| 6 Aprobado | Creación básica de elementos con organización mejorable o uso parcial de métodos correctos. | Funcionalidad implementada pero con margen de mejora. |
| 4 Insuficiente | La creación de elementos presenta errores o no responde correctamente a la interacción con el formulario. | Estructura poco clara o con fallos en la integración. |
| 2 Deficiente | Intentos fallidos o inadecuados de crear elementos dinámicos. | Código con errores graves. |
| 0 No realizado | No se ha implementado la creación de elementos. | Sin evidencia. |
Buenas prácticas a evaluar:
-
Cada elemento del gestor se genera a partir de los datos del formulario (sin contenido hardcodeado).
-
Estructura del elemento creado clara y semántica (article, div con clases BEM, etc.).
-
Inclusión del botón de eliminar dentro del elemento generado, con su evento asociado.
-
Uso de innerHTML o template literals de forma segura para construir la estructura del elemento.
Criterio 3.e — Se han eliminado elementos de documentos web.
| Nota | Descripción | Indicador |
|---|---|---|
| 10 Excelente | Implementa correctamente la eliminación individual de elementos del gestor usando remove() o removeChild(). El botón de eliminar está dentro de cada elemento creado, verifica la existencia del nodo y limpia el DOM sin errores. Los filtros también muestran y ocultan elementos de forma controlada. | Eliminación precisa y controlada, sin errores visuales ni en la consola. |
| 8 Notable | Elimina elementos correctamente, aunque sin manejar todos los casos posibles (lista vacía, elemento ya eliminado...). | Código funcional con pequeños casos sin gestionar. |
| 6 Aprobado | Elimina elementos pero con errores ocasionales o sin validación previa. | Eliminación parcialmente funcional. |
| 4 Insuficiente | El código elimina mal los elementos o genera errores visuales o en consola. | Fallos evidentes en la eliminación. |
| 2 Deficiente | La funcionalidad de eliminación no es operativa. | No cumple su función. |
| 0 No realizado | No se ha implementado la eliminación de elementos. | Sin evidencia. |
Buenas prácticas a evaluar:
-
El botón de eliminar se genera dentro de cada elemento del gestor al crearlo.
-
El evento de eliminar usa el contexto del propio elemento (this, closest, parentElement).
-
Verificación de que el elemento existe antes de intentar eliminarlo.
-
Feedback visual opcional al eliminar (animación, mensaje de confirmación...).
Criterio 3.f — Se han realizado modificaciones sobre los estilos de un documento web.
| Nota | Descripción | Indicador |
|---|---|---|
| 10 Excelente | Aplica correctamente cambios de estilo desde JavaScript en múltiples contextos: validación del formulario (clases de error/éxito en los campos), filtros (ocultar/mostrar elementos con clases CSS), y el flujo libre. Usa classList.add/remove/toggle de forma eficiente, sin mezclar estilos inline salvo cuando sea imprescindible. | Manipulación de estilos coherente, eficiente y visualmente integrada en el diseño. |
| 8 Notable | Modificación correcta de estilos en la mayoría de contextos, con algún margen de mejora en organización o reutilización de clases. | Funcionamiento adecuado con pequeños detalles. |
| 6 Aprobado | Estilos modificados correctamente en algunos contextos, pero con estructura CSS poco clara o uso excesivo de estilos inline. | Código funcional pero con margen de mejora. |
| 4 Insuficiente | Cambios visuales mal implementados o incoherentes con el diseño de la página. | Código poco pulido o con inconsistencias visuales. |
| 2 Deficiente | Estilos aplicados sin sentido o con errores que afectan la presentación. | Código visualmente confuso o defectuoso. |
| 0 No realizado | No se han realizado modificaciones de estilos desde JavaScript. | Sin evidencia. |
Buenas prácticas a evaluar:
-
Las clases CSS de estado (error, success, hidden, active...) están definidas en el CSS y se aplican desde JavaScript, no al revés.
-
Los filtros ocultan elementos con una clase CSS (hidden, display-none) en lugar de eliminarlos del DOM.
-
La validación del formulario aplica clases de error/éxito a los campos de forma individual.
-
Uso de classList.toggle para estados binarios (modo oscuro, elemento seleccionado... ).