Contenido del curso

Fundamentos Javascript

Funciones, Scope y Estructuras de Datos

Debugging y Markdown en tu app de notas

Resumen

Crear un editor de notas funcional con JavaScript puro es posible cuando combinas manipulación del DOM, almacenamiento local y una librería ligera para renderizar Markdown. Aquí verás cómo conectar los botones de guardar, eliminar y editar con la lógica de tu aplicación, y cómo resolver los errores típicos que aparecen en el camino.

¿Cómo se conectan los botones del editor con el DOM?

La base de la interactividad está en seleccionar elementos del HTML y asignarles event listeners. Cada botón cumple una función específica dentro del flujo de notas.

Para el botón de eliminar, primero defines la referencia con document.querySelector apuntando a delete-note, y luego escuchas el evento click. Dentro de la función validas que exista una nota seleccionada con currentNoteId. Si no la hay, muestras un mensaje al usuario con showMessage. Si sí existe, lanzas un confirm que pregunta ¿Estás seguro de eliminar esta nota? y, según la respuesta, ejecutas store.deleteNote(currentNoteId) [02:15].

¿Qué hace addEventListener en JavaScript? Es un método que asocia una función a un evento del DOM, como un clic o un input. Permite que tu interfaz responda a las acciones del usuario sin recargar la página.

¿Cómo capturar la nota seleccionada desde la lista?

El contenedor de la lista usa delegación de eventos, una técnica donde un solo listener escucha los clics de todos los hijos. Con event.target.closest('.note-item') localizas el elemento más cercano que coincida con la clase, y luego conviertes su dataset.id a número con Number() antes de pasarlo a store.getNoteById [05:40].

Esta conversión es importante porque el DOM siempre devuelve los datasets como string, y tu store espera valores numéricos para encontrar la nota correcta.

¿Cómo escuchar cambios en el textarea en tiempo real?

El evento input se dispara cada vez que el usuario escribe. Lo capturas en editorTextarea, extraes el valor con editorTextarea.value y lo pasas a renderPreview(content) para actualizar la vista previa al instante [04:50].

¿Cómo inicializar la aplicación correctamente?

La función initializeApp orquesta toda la carga inicial. Allí creas el store con createPersistentNoteStore, recuperas las notas guardadas en localStorage, ocultas el editor y el preview, y conectas los listeners.

Los pasos clave dentro de la inicialización son:

  • Crear el store persistente que conecta con localStorage.
  • Obtener notas existentes con store.getNotesOrderedByDate.
  • Renderizar la lista inicial con renderNoteList.
  • Ocultar editor y preview hasta que el usuario seleccione una nota.
  • Imprimir en consola el total de notas cargadas con store.getNotesCount [07:30].

Después envuelves todo en document.addEventListener('DOMContentLoaded', ...). Este evento garantiza que el HTML, CSS y JavaScript se hayan parseado antes de ejecutar tu código, evitando errores por elementos que aún no existen en el DOM.

¿Por qué usar DOMContentLoaded? Porque asegura que el navegador terminó de construir el árbol del DOM. Si tu script intenta acceder a un elemento antes, simplemente no lo encuentra y falla.

¿Cómo depurar errores comunes en JavaScript?

Los errores son parte natural del desarrollo, incluso con años de experiencia. Lo importante es leer la consola y aprovechar las pistas que el navegador te ofrece.

Durante la prueba aparecieron varios typos clásicos:

  • addEventXtener en vez de addEventListener.
  • note escrito en singular cuando debía ser notes en la línea 162.
  • deleteNoteButron con error de tipeo en lugar de deleteNoteButton en la línea 583.
  • editorTextArea mal capitalizado en la línea 606.

Cada error muestra el archivo y la línea exacta. Al hacer clic en la referencia de la consola, el navegador te lleva al punto del problema. Esto es lo que en la industria llamamos debugging: analizar el código línea por línea hasta entender qué está pasando [10:20].

¿Qué hacer cuando el error dice Reference Error: x is not defined?

Significa que estás usando una variable que no existe en ese scope. Revisa si la declaraste, si está bien escrita y si pertenece al ámbito donde la invocas.

¿Cómo renderizar Markdown a HTML con una librería?

Una vez que la app funciona, notas que el contenido en Markdown no se ve bien estilizado. La solución es markdown-it, una librería que convierte texto Markdown en HTML válido y la cargas vía CDN directamente desde el index.html.

Para integrarla creas la función renderMarkdownContent(content) que:

  • Valida que window.markdownIt no sea undefined, confirmando que el CDN cargó.
  • Inicializa la instancia con const md = window.markdownIt().
  • Retorna md.render(content) con el HTML ya transformado.

Luego, dentro de renderPreview, reemplazas el fallback manual por una sola línea: previewContainer.innerHTML = renderMarkdown(content) [13:50].

¿Qué es un CDN? Es un servidor distribuido que entrega librerías o archivos estáticos a tu aplicación. Lo usas cuando quieres incorporar una dependencia sin instalarla localmente.

Con esta integración tu editor reconoce listas, imágenes, links, blockquotes, tablas y bloques de código, todo con el render visual correcto. Y lo más interesante: construiste un sistema de notas completo con JavaScript vainilla, sin frameworks ni dependencias adicionales más allá del render de Markdown.

¿Qué funcionalidad agregarías tú a este editor de notas? Cuéntame en los comentarios.