{"id":4451,"date":"2025-01-11T12:35:00","date_gmt":"2025-01-11T12:35:00","guid":{"rendered":"https:\/\/howtogeek.blog\/es\/?p=4451"},"modified":"2025-01-11T12:35:00","modified_gmt":"2025-01-11T12:35:00","slug":"create-your-first-web-application-a-beginners-guide-to-building-a-simple-notes-app-and-word-counter","status":"publish","type":"post","link":"https:\/\/howtogeek.blog\/es\/create-your-first-web-application-a-beginners-guide-to-building-a-simple-notes-app-and-word-counter\/","title":{"rendered":"Cree su primera aplicaci\u00f3n web: gu\u00eda para principiantes sobre c\u00f3mo crear una aplicaci\u00f3n de notas y un contador de palabras sencillos"},"content":{"rendered":"<p>Comenzar tu aventura en la programaci\u00f3n puede parecer abrumador en medio de una abrumadora variedad de lenguajes y marcos de trabajo. \u00a1Incluso podr\u00edas pensar en dejar que una IA se encargue de todo! Sin embargo, \u00a1programar para la web puede ser emocionante, accesible y completamente gratis!<\/p>\n<h2 id=\"what-youll-build\">Lo que construir\u00e1s<\/h2>\n<p>En este tutorial, crear\u00e1 una aplicaci\u00f3n web sencilla dise\u00f1ada para almacenar notas de texto mientras cuenta los caracteres y las palabras dentro de esas notas.<\/p>\n<p>Esta aplicaci\u00f3n guarda datos de forma persistente, lo que le permite recuperar texto incluso despu\u00e9s de actualizar la p\u00e1gina o volver a abrirla. Es una soluci\u00f3n pr\u00e1ctica para mantener un acceso r\u00e1pido a texto importante, ya sean direcciones, URL o cualquier otra cosa.<\/p>\n<figure class=\"wp-block-image\"><img alt=\"Un ejemplo de una aplicaci\u00f3n web de texto simple que muestra notas que incluyen una entrada de calendario y una lista de URL.\" class=\"wp-image\" decoding=\"async\" height=\"569\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-app-example.webp\" title=\"Un ejemplo de una aplicaci\u00f3n web de texto simple que muestra notas que incluyen una entrada de calendario y una lista de URL.\" width=\"960\"\/><\/figure>\n<p>Adem\u00e1s, la aplicaci\u00f3n realiza un seguimiento de los recuentos de caracteres y palabras, lo que proporciona una excelente introducci\u00f3n a la manipulaci\u00f3n de cadenas. Si bien la aplicaci\u00f3n tiene un dise\u00f1o b\u00e1sico, este tutorial le brinda habilidades fundamentales para el desarrollo de aplicaciones web y le permite acceder a vastas posibilidades en la codificaci\u00f3n.<\/p>\n<h2 id=\"how-youll-build-it\">C\u00f3mo lo construir\u00e1s<\/h2>\n<p>Si bien las aplicaciones web pueden variar significativamente, por lo general integran tres tecnolog\u00edas esenciales: HTML, CSS y JavaScript. Cada uno de estos componentes cumple una funci\u00f3n crucial en el desarrollo web:<\/p>\n<ul>\n<li><strong>HTML:<\/strong> Esta es la estructura de su aplicaci\u00f3n web, que establece c\u00f3mo se organiza el contenido. HTML define si el texto es un p\u00e1rrafo, un encabezado o un elemento de lista.<\/li>\n<li><strong>CSS:<\/strong> Las hojas de estilo en cascada a\u00f1aden estilo a su contenido, lo que le permite cambiar colores, fuentes y dise\u00f1o. Puede usar CSS para poner elementos en negrita, ajustar bordes y posicionar elementos en la pantalla.<\/li>\n<li><strong>JavaScript:<\/strong> este lenguaje de programaci\u00f3n es fundamental para incorporar funcionalidad a su aplicaci\u00f3n web. JavaScript puede crear experiencias interactivas, como mostrar u ocultar elementos o crear aplicaciones complejas como juegos.<\/li>\n<\/ul>\n<figure class=\"wp-block-image\"><img alt=\"La p\u00e1gina de inicio del sitio web.dev con recursos de aprendizaje para HTML, CSS y JavaScript.\" class=\"wp-image\" decoding=\"async\" height=\"734\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-dev-homepage.webp\" title=\"La p\u00e1gina de inicio del sitio web.dev con recursos de aprendizaje para HTML, CSS y JavaScript.\" width=\"1388\"\/><\/figure>\n<h2 id=\"the-app-structure\">La estructura de la aplicaci\u00f3n<\/h2>\n<p>La aplicaci\u00f3n que est\u00e1s a punto de crear consta de tres archivos sencillos: <code>index.html<\/code>, <code>styles.css<\/code>, y <code>script.js<\/code>.<\/p>\n<p>No existen requisitos avanzados para ejecutar esta aplicaci\u00f3n: basta con un navegador web. Como se trata de una aplicaci\u00f3n front-end, no se necesitan lenguajes de programaci\u00f3n back-end como PHP o servidores locales. Una vez completada, simplemente \u00e1brala <code>index.html<\/code>en su navegador para ver su aplicaci\u00f3n en acci\u00f3n.<\/p>\n<p>Esta aplicaci\u00f3n aprovecha la API de almacenamiento web para guardar texto, lo que le permite retener informaci\u00f3n sin necesidad de escribir en archivos de disco, ya que JavaScript carece de acceso al sistema de archivos.<\/p>\n<h2 id=\"how-to-build-the-note-taker\">C\u00f3mo construir el tomador de notas<\/h2>\n<p>Comience por crear los tres archivos necesarios en el mismo directorio. Tambi\u00e9n puede descargar los archivos desde <a href=\"https:\/\/github.com\/bobbykjack\/text\" target=\"_blank\">este repositorio de GitHub<\/a> .<\/p>\n<h3 id=\"building-the-structure-with-html\">Construyendo la estructura con HTML<\/h3>\n<p>El <code>index.html<\/code>archivo establece la estructura de contenido de la aplicaci\u00f3n. Incluye referencias a los archivos CSS y JavaScript, lo que permite que el navegador los combine para lograr una experiencia perfecta.<\/p>\n<p>Al igual que cualquier documento HTML, el marco principal consta de una secci\u00f3n de encabezado con metadatos y un cuerpo que contiene el contenido:<\/p>\n<p> <code><br \/>\n<span>&lt;!DOCTYPE html&gt;<\/span><br \/>\n<span>&lt;html&gt;<\/span><br \/>\n<span>&lt;head&gt;<\/span><br \/>\n<span>...&lt;\/head&gt;<\/span><br \/>\n<span>&lt;body&gt;<\/span><br \/>\n<span>...&lt;\/body&gt;<\/span><br \/>\n<span>&lt;\/html&gt;<\/span><br \/>\n<\/code><\/p>\n<p>La secci\u00f3n principal contiene metadatos breves, incluido el t\u00edtulo de la p\u00e1gina (visible en la barra de t\u00edtulo del navegador) y un enlace al <code>styles.css<\/code>archivo:<\/p>\n<p> <code><br \/>\n<span>&lt;title&gt;Text&lt;\/title&gt;<\/span><br \/>\n<span>&lt;link rel=\"stylesheet\"href=\"styles.css\"\/&gt;<\/span><br \/>\n<\/code><\/p>\n<p>El cuerpo est\u00e1 m\u00e1s detallado, incluidos los componentes clave:<\/p>\n<p> <code><br \/>\n<span>&lt;div id=\"counter\"&gt;<\/span><br \/>\n<span>words: &lt;span id=\"words\"&gt;0&lt;\/span&gt;<\/span><br \/>\n<span>\/ characters: &lt;span id=\"chars\"&gt;0&lt;\/span&gt;<\/span><br \/>\n<span>&lt;\/div&gt;<\/span><br \/>\n<span>&lt;textarea id=\"text\"autofocus=\"1\"&gt;&lt;\/textarea&gt;<\/span><br \/>\n<span>&lt;script src=\"script.js\"&gt;&lt;\/script&gt;<\/span><br \/>\n<\/code><\/p>\n<p>El <code>div<\/code>elemento, identificado como \u201ccontador\u201d, contiene el recuento de palabras y caracteres. Permanece en la parte superior y se actualiza din\u00e1micamente a medida que cambia el texto.<\/p>\n<p>Es fundamental tener en cuenta el uso de <code>id<\/code>atributos: sus valores \u00fanicos ayudan a darle estilo a estos elementos y orientarlos seg\u00fan su funcionalidad.<\/p>\n<p>Proporciona <code>textarea<\/code>un \u00e1rea para que los usuarios ingresen texto con el <code>autofocus<\/code>atributo, lo que garantiza que est\u00e9 listo para escribirse al cargar la p\u00e1gina. Por \u00faltimo, el HTML hace referencia al <code>script.js<\/code>archivo.<\/p>\n<p>En este punto, \u00e1brelo <code>index.html<\/code>en un navegador. A\u00fan no funcionar\u00e1 y es posible que no se vea del todo bien, pero es \u00fatil verificar tu progreso en cada etapa.<\/p>\n<figure class=\"wp-block-image\"><img alt=\"Una vista de la aplicaci\u00f3n web para tomar notas con estilos de navegador predeterminados, que muestra todo agrupado en la esquina superior izquierda.\" class=\"wp-image\" decoding=\"async\" height=\"569\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-app-no-style.webp\" title=\"Una vista de la aplicaci\u00f3n web para tomar notas con estilos de navegador predeterminados, que muestra todo agrupado en la esquina superior izquierda.\" width=\"960\"\/><\/figure>\n<h3 id=\"making-things-look-good-with-css\">C\u00f3mo hacer que las cosas se vean bien con CSS<\/h3>\n<p>Si bien esta aplicaci\u00f3n b\u00e1sica no requiere grandes ajustes de dise\u00f1o, podemos mejorar su dise\u00f1o con algo de estilo.<\/p>\n<p>Primero, establecemos el estilo de la carrocer\u00eda para delinear la apariencia general:<\/p>\n<p> <code><br \/>\n<span>body {<\/span><br \/>\n<span> margin: 0;<\/span><br \/>\n<span> padding: 0;<\/span><br \/>\n<span> display: grid;<\/span><br \/>\n<span> min-height: 100vh;<\/span><br \/>\n<span> grid-template-rows: min-content 1fr;<\/span><br \/>\n<span>}<\/span><br \/>\n<\/code><\/p>\n<p>Este CSS emplea <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/CSS_grid_layout\" target=\"_blank\">un dise\u00f1o de cuadr\u00edcula<\/a> para organizar los recuentos de palabras y caracteres en una fila angosta sobre el \u00e1rea de texto. La <code>grid-template-rows<\/code>propiedad determina que la fila de recuento debe ocupar el menor espacio posible (min-content) mientras que el \u00e1rea de texto llena el espacio restante (1fr).<\/p>\n<p>La fila del contador recibe un estilo b\u00e1sico para distinguirla del \u00e1rea de texto, principalmente a trav\u00e9s de su fondo:<\/p>\n<p> <code><br \/>\n<span>#counter {<\/span><br \/>\n<span> font-family: sans-serif;<\/span><br \/>\n<span> background-color: #f7f7f7;<\/span><br \/>\n<span> text-align: center;<\/span><br \/>\n<span> width: 100%;<\/span><br \/>\n<span> padding: 0 0.5em 0;<\/span><br \/>\n<span>}<\/span><br \/>\n<\/code><\/p>\n<p>El \u00e1rea de texto est\u00e1 dise\u00f1ada para garantizar que el texto sea legible, permitiendo un espacio en blanco adecuado:<\/p>\n<p> <code><br \/>\n<span>textarea {<\/span><br \/>\n<span> width: 100%;<\/span><br \/>\n<span> height: 100%;<\/span><br \/>\n<span> font-size: 16pt;<\/span><br \/>\n<span> padding: 1em;<\/span><br \/>\n<span> box-sizing: border-box;<\/span><br \/>\n<span> outline: 0;<\/span><br \/>\n<span> border: none;<\/span><br \/>\n<span> border-top: 1px solid #999;<\/span><br \/>\n<span>}<\/span><br \/>\n<\/code><\/p>\n<figure class=\"wp-block-image\"><img alt=\"La aplicaci\u00f3n para tomar notas con estilos personalizados muestra la barra del contador en la parte superior con un \u00e1rea de texto de tama\u00f1o completo debajo.\" class=\"wp-image\" decoding=\"async\" height=\"569\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-app-with-style.webp\" title=\"La aplicaci\u00f3n para tomar notas con estilos personalizados muestra la barra del contador en la parte superior con un \u00e1rea de texto de tama\u00f1o completo debajo.\" width=\"960\"\/><\/figure>\n<h3 id=\"adding-functionality-with-javascript\">A\u00f1adiendo funcionalidad con JavaScript<\/h3>\n<p>Una vez establecidas las bases, es hora de incorporar funcionalidad a su aplicaci\u00f3n: \u00a1el c\u00f3digo que le da vida!<\/p>\n<p>Antes de comenzar a codificar, es fundamental definir la funcionalidad prevista. Para esta aplicaci\u00f3n, te centrar\u00e1s en dos objetivos principales:<\/p>\n<ul>\n<li>Persistir y recargar el texto ingresado.<\/li>\n<li>Actualice el n\u00famero de caracteres y palabras de forma din\u00e1mica.<\/li>\n<\/ul>\n<p>Estas funciones requieren actualizaciones de determinados elementos del documento. Por lo tanto, comience por obtener referencias a estos nodos mediante el <code>getElementById<\/code>m\u00e9todo:<\/p>\n<p> <code><br \/>\n<span>const words = document.getElementById(\"words\");<\/span><br \/>\n<span>const chars = document.getElementById(\"chars\");<\/span><br \/>\n<span>const textarea = document.getElementById(\"text\");<\/span><br \/>\n<\/code><\/p>\n<p>Aqu\u00ed, <code>words<\/code>, <code>chars<\/code>, y <code>textarea<\/code>corresponden a sus respectivas secciones en el documento, identificadas por sus atributos ID.<\/p>\n<p>A continuaci\u00f3n, introduzca la interactividad configurando la aplicaci\u00f3n para que responda cuando se modifique el texto:<\/p>\n<p> <code><br \/>\n<span>textarea.addEventListener(\"input\", function(ev) {<\/span><br \/>\n<span> localStorage.setItem(\"text\", ev.target.value);<\/span><br \/>\n<span> update_counts(ev.target.value);<\/span><br \/>\n<span>});<\/span><br \/>\n<\/code><\/p>\n<p>El <code>addEventListener<\/code>m\u00e9todo vincula una funci\u00f3n para que se active cuando se produce un evento espec\u00edfico. En este caso, una vez que el usuario interact\u00faa con el \u00e1rea de texto, el evento \u201centrada\u201d activa la funci\u00f3n.<\/p>\n<p>A continuaci\u00f3n, se utiliza la API de almacenamiento web para conservar el contenido actual del \u00e1rea de texto, al que se accede mediante <code>ev.target.value<\/code>. El <code>setItem<\/code>m\u00e9todo asocia una clave con los datos que se van a almacenar.<\/p>\n<p>Para garantizar que el texto se cargue cuando la aplicaci\u00f3n se inicializa o se actualiza, agregue otro detector:<\/p>\n<p> <code><br \/>\n<span>window.addEventListener(\"load\", function(ev) {<\/span><br \/>\n<span> var text = localStorage.getItem(\"text\");<\/span><br \/>\n<span> textarea.value = text;<\/span><br \/>\n<span> update_counts(text);<\/span><br \/>\n<span>});<\/span><br \/>\n<\/code><\/p>\n<p>Este detector responde al evento de carga de la ventana. Al cargar la ventana, recupera el texto guardado y establece el valor del \u00e1rea de texto en consecuencia mientras invoca <code>update_counts()<\/code>para actualizar los recuentos de palabras y caracteres.<\/p>\n<p>La funcionalidad restante reside en la <code>update_counts()<\/code>funci\u00f3n, que tiene este aspecto:<\/p>\n<p> <code><br \/>\n<span>function update_counts(text) {<\/span><br \/>\n<span> chars.innerHTML = text.length;<\/span><br \/>\n<span> words.innerHTML = text.split(' ').length;<\/span><br \/>\n<span>}<\/span><br \/>\n<\/code><\/p>\n<p>A diferencia de un \u00e1rea de texto, el texto sin formato no tiene un atributo de valor; por lo tanto, <code>innerHTML<\/code>se utiliza la propiedad en su lugar. La <code>length<\/code>propiedad de una cadena recupera el recuento total de caracteres.<\/p>\n<p>Para dividir el texto en palabras, utilizamos <code>text.split(' ')<\/code>, que divide la cadena en cada car\u00e1cter de espacio, lo que produce una matriz de palabras. La propiedad length de la matriz resultante proporciona la cantidad de palabras.<\/p>\n<p>Sin embargo, es posible que encuentres un par de desaf\u00edos con este c\u00f3digo:<\/p>\n<ol>\n<li>No contar\u00e1 correctamente palabras individuales en una l\u00ednea sin caracteres de espacio alrededor.<\/li>\n<li>Si no hay texto presente, se informar\u00e1 incorrectamente una sola palabra debido a su forma <code>split<\/code>de operar.<\/li>\n<\/ol>\n<p>Para solucionar el primer problema, considere dividir en una expresi\u00f3n regular para tener en cuenta los caracteres de espacio en blanco: <code>\\s<\/code>. Para solucionar el segundo problema, filtre las cadenas vac\u00edas:<\/p>\n<p> <code><br \/>\n<span> words.innerHTML = text.split(\/\\s\/).filter(function(n) { return n! = ''; }).length;<\/span><br \/>\n<\/code><\/p>\n<figure class=\"wp-block-image\"><img alt=\"La aplicaci\u00f3n web con texto de ejemplo, que muestra recuentos precisos de caracteres y palabras.\" class=\"wp-image\" decoding=\"async\" height=\"569\" loading=\"lazy\" src=\"https:\/\/cdn.howtogeek.blog\/wp-content\/uploads\/2025\/01\/web-app-final.webp\" title=\"La aplicaci\u00f3n web con texto de ejemplo, que muestra recuentos precisos de caracteres y palabras.\" width=\"960\"\/><\/figure>\n<p>\u00a1Se pueden crear aplicaciones web \u00fatiles con tan solo unos pocos archivos b\u00e1sicos! Puede ampliar esta sencilla aplicaci\u00f3n para tomar notas integrando funciones adicionales, como emplear la <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Window\/location\" target=\"_blank\">propiedad window.location<\/a> para acceder a URL o permitir guardar varias notas variando los nombres que se pasan a <code>localStorage.setItem<\/code>.<\/p>\n<h3>Informaci\u00f3n adicional<\/h3>\n<h4><strong>1. \u00bfCu\u00e1les son los requisitos previos para este tutorial de aplicaci\u00f3n web?<\/strong><\/h4>\n<p>Todo lo que necesitas es un conocimiento b\u00e1sico de HTML, CSS y JavaScript. Tambi\u00e9n te resultar\u00e1n \u00fatiles herramientas como un editor de texto (por ejemplo, VSCode) y un navegador web.<\/p>\n<h4><strong>2. \u00bfPuedo modificar esta aplicaci\u00f3n web para agregar m\u00e1s funciones?<\/strong><\/h4>\n<p>\u00a1Por supuesto! Este tutorial proporciona una base. \u00a1Puedes agregar funciones como guardar varias notas, categorizar notas o incluso implementar una funci\u00f3n de b\u00fasqueda!<\/p>\n<h4><strong>3. \u00bfC\u00f3mo funciona la API de almacenamiento web?<\/strong><\/h4>\n<p>La API de almacenamiento web permite que las aplicaciones web almacenen datos en el navegador. Almacena datos en pares clave-valor que persisten incluso despu\u00e9s de cerrar el navegador, lo que facilita su recuperaci\u00f3n posterior.<\/p>\n<p><a class=\"xiaomi\" href=\"https:\/\/www.howtogeek.com\/build-your-first-web-app-a-simple-word-counter\/\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Fuente e im\u00e1genes<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comenzar tu aventura en la programaci\u00f3n puede parecer abrumador en medio de una abrumadora variedad de lenguajes y marcos de trabajo. \u00a1Incluso podr\u00edas pensar en dejar que una IA se encargue de todo! Sin embargo, \u00a1programar para la web puede ser emocionante, accesible y completamente gratis! Lo que construir\u00e1s En este tutorial, crear\u00e1 una aplicaci\u00f3n [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[679,205,7],"class_list":["post-4451","post","type-post","status-publish","format-standard","hentry","category-how-to","tag-apps-web-apps","tag-programming","tag-windows"],"acf":[],"_links":{"self":[{"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/posts\/4451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/comments?post=4451"}],"version-history":[{"count":1,"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/posts\/4451\/revisions"}],"predecessor-version":[{"id":4452,"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/posts\/4451\/revisions\/4452"}],"wp:attachment":[{"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/media?parent=4451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/categories?post=4451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/howtogeek.blog\/es\/wp-json\/wp\/v2\/tags?post=4451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}