<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Ener Octavio Buitrago Camelo - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Ener Octavio Buitrago Camelo - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 17 Jun 2026 20:24:03 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/ener/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Manejo de formularios del lado del cliente con JavaScript: explicado con código de ejemplo ]]>
                </title>
                <description>
                    <![CDATA[ Los formularios HTML son componentes esenciales de la mayoría de los sitios web y aplicaciones web. Permiten la interacción entre los usuarios y esos sitios web y son un concepto clave que deben comprender los desarrolladores web. Esta guía completa cubre varios aspectos de los formularios HTML, desde cómo crear ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/manejo-de-formularios-del-lado-del-cliente-con-javascript-explicado-con-codigo-de-ejemplo/</link>
                <guid isPermaLink="false">661e6d551238a40479c59260</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ener Octavio Buitrago Camelo ]]>
                </dc:creator>
                <pubDate>Tue, 07 May 2024 14:49:03 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/04/Gemini_Generated_Image--19--1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/form-validation-in-javascript/#let-s-see-an-example-registration-form" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Client-Side Form Handling with JavaScript – Explained with Example Code</a>
      </p><p>Los formularios HTML son componentes esenciales de la mayoría de los sitios web y aplicaciones web. Permiten la interacción entre los usuarios y esos sitios web y son un concepto clave que deben comprender los desarrolladores web.</p><p>Esta guía completa cubre varios aspectos de los formularios HTML, desde cómo crear y estructurar formularios hasta la interacción de JavaScript y la validación de formularios.</p><p>Comprender cómo trabajar con formularios mediante programación le permite validar y capturar las entradas del usuario, gestionar los envíos y mejorar la experiencia general del usuario.</p><p>Si sigue los ejemplos y las mejores prácticas proporcionados en esta guía, obtendrá el conocimiento necesario para crear formularios web sólidos que mejoren la experiencia del usuario y faciliten la recopilación y el envío de datos sin problemas.</p><p>Ya sea un desarrollador principiante o experimentado, esta guía constituye un recurso valioso para comprender e implementar formularios HTML de manera efectiva en sus proyectos web.</p><h3 id="requisitos-previos-"><strong><strong><strong>Requisitos previos:</strong></strong></strong></h3><p>Se recomienda una comprensión básica de los fundamentos de JavaScript para comprender completamente los conceptos discutidos en este tutorial. La familiaridad con los formularios HTML también será beneficiosa para comprender y aplicar el material cubierto.</p><p>Si es nuevo en JavaScript, le recomendamos que se familiarice con las variables, los tipos de datos, las funciones, los bucles y las técnicas básicas de manipulación de DOM antes de sumergirse en este tutorial. Este conocimiento fundamental facilitará una experiencia de aprendizaje más fluida a medida que exploramos temas más avanzados relacionados con el manejo de formularios en JavaScript.</p><p>Nota inicial: Para su comodidad, se puede acceder a todos los ejemplos y códigos analizados aquí en <a href="https://github.com/theSamyak/FCC-Blog-CodeArchive/tree/main/Client-Side%20Form%20Handling%20with%20JavaScript">GitHub</a> .</p><h2 id="tabla-de-contenido"><strong><strong><strong>Tabla de contenido</strong></strong></strong></h2><ol><li><a href="#compreder">Comprensión de los formularios HTML</a><br>– <a href="#intro-formulario">Introducción a los elementos del formulario HTML</a><br>– <a href="#manejo-formularios">JavaScript y manejo de formularios</a><br>– <a href="#cacceder">Acceso a los campos del formulario</a><br>– <a href="#ejemplo-registro">Ejemplo: formulario de registro</a></li><li><a href="#botones-radio">Cómo crear botones de opción</a><br>– <a href="#recuperar">JavaScript para manejar la selección de botones de opción</a><br>– <a href="#cambio-boton">Evento de cambio de botón de opción</a></li><li><a href="#casillas">Casillas de verificación</a><br>– <a href="#comprobar">Cómo comprobar si una casilla de verificación está marcada</a><br>– <a href="#obtener-valores">Cómo obtener valores de casilla de verificación</a><br>– <a href="#manejar-varias">Cómo manejar varias casillas de verificación</a><br>– <a href="#marcar-casillas">Cómo marcar/desmarcar todas las casillas de verificación</a><br>– <a href="#generar-casillas">Cómo generar casillas de verificación dinámicamente</a></li><li><a href="#elemento">Seleccionar elemento</a><br>– <a href="#interactuar-elemento">Cómo interactuar con un elemento de selección</a><br>– <a href="#acceder">Cómo acceder a opciones con JavaScript</a><br>– <a href="#manejar">Cómo manejar selecciones múltiples</a><br>– <a href="#admi-tareas">Ejemplo: Administrador de tareas</a></li><li><a href="#diferencia">Diferencia entre cambio y evento de entrada</a></li><li><a href="https://www.freecodecamp.org/news/form-validation-in-javascript/#conclusion">Conclusión</a></li></ol><p>Antes de comenzar, aquí hay algo a tener en cuenta:</p><p>Este es un blog de seguimiento de este <a href="https://www.freecodecamp.org/news/javascript-in-the-browser-dom-and-events/">Manual de eventos y DOM</a> y no cubre la comunicación del lado del servidor ni el manejo de formularios del lado del servidor en este blog, ya que involucra temas avanzados como AJAX (JavaScript asíncrono y XML), promesas, manejo de errores y manejo. Operaciones asincrónicas en JavaScript.</p><p>En este tutorial, nos centraremos en cómo trabajar con varios elementos de formulario, incluidos botones de opción, casillas de verificación y elementos de selección, así como en cómo generarlos e interactuar dinámicamente con ellos usando JavaScript.</p><p>Profundizar en la comunicación del lado del servidor iría más allá del alcance de este artículo, cuyo objetivo es proporcionar una comprensión integral de la manipulación DOM y el manejo de eventos dentro del contexto de los elementos de formulario.</p><!--kg-card-begin: html--><h2 id="compreder">Comprender los formularios HTML</h2><!--kg-card-end: html--><p>Los formularios HTML son elementos fundamentales que se utilizan para recopilar y enviar datos de los usuarios en la web. Permiten la interacción entre los usuarios y los sitios web al permitirles ingresar información, realizar selecciones y enviar datos a servidores para su procesamiento.</p><!--kg-card-begin: html--><h3 id="intro-formulario">Introducción a los elementos de formulario HTML</h3><!--kg-card-end: html--><p>Los formularios HTML se crean utilizando el <code>&lt;form&gt;</code>elemento, que actúa como contenedor para varios elementos de entrada. Los elementos de formulario comunes incluyen campos de texto, casillas de verificación, botones de opción, menús desplegables y botones.</p><p>Para hacer referencia a un formulario en JS, puede utilizar métodos DOM como <code>getElementById()</code>o <code>document.forms</code>. <code>document.forms</code>devuelve una colección de formularios y puede acceder a un formulario específico utilizando un índice, nombre o identificación.</p><pre><code class="language-javascript">const form = document.getElementById('signup');
const firstForm = document.forms[0]; // accessing first form
const formByName = document.forms['formName']; // accessing form by name
const formById = document.forms['formId']; // accessing form by id
</code></pre><p>Veamos un ejemplo básico de un formulario HTML:</p><pre><code class="language-html">&lt;form&gt;
  &lt;label for="username"&gt;Username:&lt;/label&gt;
  &lt;input type="text" id="username" name="username"&gt;&lt;br&gt;

  &lt;label for="password"&gt;Password:&lt;/label&gt;
  &lt;input type="password" id="password" name="password"&gt;&lt;br&gt;

  &lt;input type="submit" value="Submit"&gt;
&lt;/form&gt;
</code></pre><p>En este ejemplo, tenemos un formulario con dos campos de entrada para nombre de usuario y contraseña, junto con un botón de envío.</p><!--kg-card-begin: html--><h3>Estructura y atributos del formulario</h3><!--kg-card-end: html--><p>Los formularios HTML pueden tener varios atributos que controlan su comportamiento y apariencia. Algunos atributos comunes incluyen:</p><ul><li><strong><strong>acción:</strong></strong> Especifica la URL donde se deben enviar los datos del formulario.</li><li><strong><strong>método:</strong></strong> especifica el método HTTP utilizado para enviar datos del formulario ( <code>post</code>o <code>get</code>).</li><li><strong><strong>objetivo</strong></strong> : especifica dónde mostrar la respuesta después del envío del formulario (por ejemplo, <code>_self</code>, <code>_blank</code>, <code>_parent</code>) <code>_top</code>.</li><li><strong><strong>nombre</strong></strong> : Asigna un nombre al formulario con fines de identificación.</li></ul><p>A continuación se muestra un ejemplo de un formulario con atributos de acción, método y destino:</p><pre><code class="language-html">&lt;form action="/submit-form" method="POST" name="myForm" target="_blank"&gt;
  &lt;!-- Form elements go here --&gt;
&lt;/form&gt;
</code></pre><!--kg-card-begin: html--><h3 id="manejo-formularios">JavaScript y manejo de formularios</h3><!--kg-card-end: html--><p>JavaScript usa el <code>HTMLFormElement</code>objeto para representar un formulario. Este objeto tiene propiedades correspondientes a los atributos HTML <code>action</code>y <code>method</code>.</p><p>Métodos como <code>submit()</code>y <code>reset()</code>se utilizan para enviar y restablecer formularios.</p><pre><code class="language-html">const form = document.getElementById('signup');
form.action; // returns the action attribute
form.method; // returns the method attribute
form.submit(); // submits the form
</code></pre><p>JavaScript proporciona controladores de eventos para agregar interactividad a los formularios HTML. Al aprovechar estos eventos, puede ejecutar scripts personalizados en respuesta a las acciones del usuario dentro del formulario:</p><p><strong><strong>Enviar evento</strong></strong> : un formulario generalmente tiene un botón de envío que, al hacer clic, envía los datos del formulario al servidor. Esto se logra usando un elemento <code>&lt;input&gt;</code>o <code>&lt;button&gt;</code>con <code>type="submit"</code>.</p><pre><code class="language-html">&lt;input type="submit" value="Sign Up"&gt;
// or
&lt;button type="submit"&gt;Sign Up&lt;/button&gt;</code></pre><p>Para adjuntar un detector de eventos al evento de envío, utilice el <code>addEventListener()</code>método. He aquí un ejemplo:</p><pre><code class="language-javascript">const form = document.getElementById('signup');
form.addEventListener('submit', (event) =&gt; {
    // Custom validation and submission logic here
});
</code></pre><p>En muchos casos, es posible que desee interceptar el comportamiento de envío de formulario predeterminado y ejecutar una lógica personalizada antes de permitir que el formulario se envíe al servidor. Puedes usar <code>preventDefault()</code>para esto. Ejemplo:</p><pre><code class="language-javascript">const form = document.getElementById('signup');
form.addEventListener('submit', (event) =&gt; {
    event.preventDefault(); // Prevents the default form submission
    // Custom validation and submission logic here
});</code></pre><p>Sin <code>event.preventDefault()</code>, cualquier lógica de envío y validación personalizada aún se ejecutaría dentro del detector de eventos, pero no se impediría el comportamiento de envío de formulario predeterminado.</p><p><strong><strong>Restablecer evento</strong></strong> : el <code>reset</code>evento se activa cuando el formulario se restablece mediante un botón de reinicio o mediante programación. Usamos <code>reset()</code>un método para borrar todos los campos del formulario y restablecerlos a sus valores predeterminados.</p><pre><code class="language-javascript">document.querySelector('form').addEventListener('reset', function(event) {
    // Custom form reset logic here
});</code></pre><!--kg-card-begin: html--><h3 id="acceder">Cómo acceder a los campos del formulario</h3><!--kg-card-end: html--><p>Puede acceder a los campos del formulario utilizando métodos DOM como <code>getElementsByName()</code>,,, etc.<code>getElementById()querySelector()</code></p><p>La <code>form.elements</code>propiedad almacena una colección de elementos de formulario. Puede acceder a estos Elementos por índice, identificación o nombre. He aquí un ejemplo:</p><pre><code class="language-javascript">const form = document.getElementById('signup');
const nameField = form.elements['name']; // accessing element by name
const emailField = form.elements['email']; // accessing element by name
const firstElement = form.elements[0]; // accessing first element by index no.
</code></pre><p>Una vez que haya accedido a un campo de formulario, puede usar la <code>value</code>propiedad para acceder a su valor. He aquí un ejemplo:</p><pre><code class="language-javascript">const nameValue = nameField.value;
const emailValue = emailFieldByName.value;
</code></pre><p><strong>Validación de formulario</strong></p><p>La validación de formularios es un aspecto esencial del desarrollo web que garantiza que los datos enviados por los usuarios sean precisos y cumplan con los criterios específicos antes de ser procesados ​​por el servidor. Las validaciones comunes incluyen la verificación de campos vacíos, formatos de correo electrónico válidos, etc.</p><h4 id="validaci-n-de-formulario-html"><strong>Validación de formulario HTML</strong></h4><p>HTML5 proporciona validación de formularios integrada a través de varios atributos:</p><ul><li><strong><strong>obligatorio</strong></strong> : Especifica que se debe completar un campo.</li><li><strong><strong>patrón</strong></strong> : especifica un patrón de expresión regular que el valor de entrada debe coincidir.</li><li><strong><strong>min</strong></strong> y <strong><strong>max</strong></strong> : especifique los valores mínimo y máximo para un campo de entrada.</li><li><strong><strong>maxlength</strong></strong> y <strong><strong>minlength</strong></strong> : especifican la longitud máxima y mínima de la entrada</li><li><strong><strong>tipo</strong></strong> : especifica el tipo de entrada esperada (por ejemplo, correo electrónico, número, fecha).</li></ul><p>A continuación se muestra un ejemplo de validación de formulario HTML utilizando estos atributos:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;form&gt;
  &lt;label for="username"&gt;Username:&lt;/label&gt;
  &lt;input type="text" id="username" name="username" required minlength="3" maxlength="15"&gt;&lt;br&gt;

  &lt;label for="email"&gt;Email:&lt;/label&gt;
  &lt;input type="email" id="email" name="email" required&gt;&lt;br&gt;

  &lt;label for="age"&gt;Age:&lt;/label&gt;
  &lt;input type="number" id="age" name="age" min="18" max="99"&gt;&lt;br&gt;

  &lt;input type="submit" value="Submit"&gt;
&lt;/form&gt;
</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">En este ejemplo, el campo de nombre de usuario debe tener entre 3 y 15 caracteres, el campo de correo electrónico debe estar completo y en el formato correcto, y la edad debe estar entre 18 y 99 años.</font></font></figcaption></figure><h4 id="validaci-n-de-formularios-javascript"><strong>Validación de formularios JavaScript</strong></h4><p>JavaScript permite a los desarrolladores realizar una lógica de validación más sofisticada más allá de lo que ofrecen los atributos HTML. Los detectores de eventos se pueden adjuntar a elementos de formulario para manejar la validación dinámicamente.</p><p>A continuación se muestra un ejemplo básico de validación de formularios JavaScript:</p><pre><code class="language-javascript">const form = document.querySelector('form');

form.addEventListener('submit', function(event) {
    event.preventDefault(); // Prevent form submission

    // Perform custom validation logic
    const email = document.getElementById('email').value;
    const password = document.getElementById('password').value;

    if (!emailIsValid(email)) {
        alert('Please enter a valid email address.');
        return;
    }

    if (password.length &lt; 6) {
        alert('Password must be at least 6 characters long.');
        return;
    }

    // If validation passes, submit the form
    form.submit();
});

function emailIsValid(email) {
    return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
</code></pre><p>En este ejemplo, la función JavaScript <code>emailIsValid()</code>utiliza una expresión regular para validar el formato del correo electrónico. El <code>submit</code>detector de eventos evita que se envíe el formulario si falla la validación y se muestran mensajes de error personalizados al usuario.</p><!--kg-card-begin: html--><h2 id="ejemplo-registro">Veamos un ejemplo: Formulario de registro</h2><!--kg-card-end: html--><p>Ahora, combinemos todos los conceptos que hemos cubierto en un ejemplo completo de un formulario de registro con validación del lado del cliente usando JavaScript:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;body&gt;
    &lt;h2&gt;User Registration&lt;/h2&gt;
    &lt;form id="registrationForm"&gt;
      &lt;div&gt;
        &lt;label for="username"&gt;Username:&lt;/label&gt;
        &lt;input type="text" id="username" name="username" /&gt;
      &lt;/div&gt;
      &lt;div&gt;
        &lt;label for="email"&gt;Email:&lt;/label&gt;
        &lt;input type="email" id="email" name="email" /&gt;
      &lt;/div&gt;
      &lt;div&gt;
        &lt;label for="password"&gt;Password:&lt;/label&gt;
        &lt;input type="password" id="password" name="password" /&gt;
      &lt;/div&gt;
      &lt;div&gt;
        &lt;input type="submit" value="Register" /&gt;
      &lt;/div&gt;
    &lt;/form&gt;

    &lt;div id="errorMessages"&gt;&lt;/div&gt;
    &lt;script src="script.js"&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><p><strong><strong>Estructura HTML</strong></strong> : Tenemos un formulario de registro simple con campos para nombre de usuario, correo electrónico, contraseña y un botón de envío. También hay un contenedor div ( <code>errorMessages</code>) para mostrar mensajes de error de validación.</p><p>Ahora escribamos código JavaScript para manejar el envío de formularios y realizar la validación del lado del cliente:</p><pre><code class="language-javascript">const registrationForm = document.getElementById("registrationForm");
const errorMessages = document.getElementById("errorMessages");

registrationForm.addEventListener("submit", function (event) {
  event.preventDefault();

  const { username, email, password } = registrationForm.elements;

  errorMessages.innerHTML = "";

  if (!username.value.trim()) {
    displayError("Username is required.");
    return;
  }

  if (!email.value.trim() || !isValidEmail(email.value)) {
    displayError("Please enter a valid email address.");
    return;
  }

  if (!password.value.trim() || !isStrongPassword(password.value)) {
    displayError(
      "Password must be at least 8 characters long and contain at least one uppercase letter, one lowercase letter, one digit, and one special character."
    );
    return;
  }

  alert("Registration successful!");
  registrationForm.reset();
});

function displayError(message) {
  errorMessages.innerHTML += `&lt;div class="error"&gt;${message}&lt;/div&gt;`;
}

function isValidEmail(email) {
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}

function isStrongPassword(password) {
  return /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&amp;*]).{8,}$/.test(password);
}
</code></pre><p><strong><strong>Manejo de JavaScript</strong></strong> : Seleccionamos el formulario y el contenedor del mensaje de error usando <code>getElementById</code>. Adjuntamos un detector de eventos al evento de envío del formulario. Cuando se envía el formulario, evitamos su comportamiento predeterminado utilizando <code>event.preventDefault()</code>para manejar el envío del formulario manualmente.</p><p><strong><strong>Validación de formulario</strong></strong> : Recuperamos los valores de nombre de usuario, correo electrónico y contraseña.</p><p>Realizamos una validación básica: el nombre de usuario no debe estar vacío, el correo electrónico debe tener un formato válido, la contraseña debe tener al menos 8 caracteres y contener al menos una letra mayúscula, una letra minúscula, un dígito y un carácter especial.</p><p><strong><strong>Manejo de errores</strong></strong> : si alguna validación falla, mostramos el mensaje de error correspondiente. Los mensajes de error se muestran en el <code>errorMessages</code>div.</p><p><strong><strong>Restablecer formulario</strong></strong> : tras el registro exitoso (en este caso, una alerta simple), restablecemos el formulario usando<code>registrationForm.reset()</code></p><p>Actualmente, el código utiliza un <code>alert</code>para indicar un registro exitoso. En un escenario real, es posible que desee implementar una llamada AJAX para enviar los datos a un servidor para su procesamiento y manejar la respuesta en consecuencia. Pero eso no es lo que vamos a discutir, como se mencionó al comienzo de este tutorial.</p><p>En general, este ejemplo cubre la creación de formularios, el manejo de formularios con JavaScript, la validación de formularios mediante expresiones regulares y la visualización dinámica de mensajes de error personalizados, lo que demuestra un formulario de registro de usuario básico con validación del lado del cliente.</p><!--kg-card-begin: html--><h2 id="botones-radio">Botones de radio</h2><!--kg-card-end: html--><p>Los botones de opción son un elemento de formulario común que se utiliza para seleccionar una opción de un conjunto de opciones. En JavaScript, puede manipular botones de opción para recuperar selecciones de usuario y realizar acciones basadas en esas selecciones.</p><!--kg-card-begin: html--><h3>Cómo crear botones de radio</h3><!--kg-card-end: html--><p>Puede utilizar botones de opción para que los usuarios seleccionen solo una opción de un conjunto de opciones. En HTML, puede crear botones de opción utilizando el <code>&lt;input&gt;</code>elemento con el <code>type</code>atributo establecido en "radio". Un grupo de botones de opción con el mismo <code>name</code>atributo forma un grupo de opción.</p><p>He aquí un ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;body&gt;
    &lt;form id="languageForm"&gt;
      &lt;p&gt;Select your favorite programming language:&lt;/p&gt;
      &lt;div&gt;
        &lt;input type="radio" name="language" value="JavaScript" id="js" /&gt;
        &lt;label for="js"&gt;JavaScript&lt;/label&gt;
      &lt;/div&gt;
      &lt;div&gt;
        &lt;input type="radio" name="language" value="Python" id="python" /&gt;
        &lt;label for="python"&gt;Python&lt;/label&gt;
      &lt;/div&gt;
      &lt;div&gt;
        &lt;input type="radio" name="language" value="Java" id="java" /&gt;
        &lt;label for="java"&gt;Java&lt;/label&gt;
      &lt;/div&gt;
      &lt;!-- More language options can be added here --&gt;
    &lt;/form&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">En este ejemplo, name="language" agrupa los botones de radio con sus respectivos valores</font></font></figcaption></figure><p>Utilice los atributos <code>id</code>y <code>for</code>para accesibilidad, vinculando la etiqueta al botón de opción correspondiente.</p><!--kg-card-begin: html--><h3 id="recuperar">Cómo recuperar el valor del botón de opción seleccionado</h3><!--kg-card-end: html--><p>Ahora, analicemos cómo recuperar el valor del botón de opción seleccionado usando JavaScript.</p><figure class="kg-card kg-code-card"><pre><code class="language-html">    &lt;!-- HTML --&gt;
    &lt;button id="btn"&gt;Show Selected Language&lt;/button&gt;
    &lt;p id="output"&gt;&lt;/p&gt;

    &lt;script&gt;
      const btn = document.querySelector("#btn");
      const radioButtons = document.querySelectorAll('input[name="language"]');
      const output = document.getElementById("output");

      btn.addEventListener("click", () =&gt; {
        let selectedLanguage;
        for (const radioButton of radioButtons) {
          if (radioButton.checked) {
            selectedLanguage = radioButton.value;
            break;
          }
        }
        // Displaying the output:
        output.innerText = selectedLanguage
          ? `You selected ${selectedLanguage}`
          : `You haven't selected any language`;
      });
    &lt;/script&gt;</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Dentro del detector de eventos, iteramos sobre los botones de opción para encontrar el seleccionado y mostrar su valor.</font></font></figcaption></figure><p>Así es como funciona el código: el código JavaScript se inicializa seleccionando el botón, los botones de opción y los elementos de salida del documento HTML. Agregamos un detector de eventos de clic al elemento del botón. Cuando se hace clic en el botón, se ejecuta la función dentro del detector de eventos.</p><p>Dentro del detector de eventos de clic, iteramos sobre todos los botones de opción de la <code>radioButtons</code>colección. Verificamos si un botón de opción está marcado usando su <code>checked</code>propiedad. Si un botón de opción está marcado, asignamos su valor a la <code>selectedLanguage</code>variable y salimos del bucle usando <code>break</code>.</p><p>Actualizamos el contenido del elemento de salida ( <code>&lt;p&gt;</code>etiqueta con id <code>output</code>) en función de si se selecciona un idioma. Si se selecciona un idioma ( <code>selectedLanguage</code>es veraz), mostramos un mensaje indicando el idioma seleccionado. De lo contrario, le solicitamos al usuario que seleccione un idioma.</p><!--kg-card-begin: html--><h3 id="cambio-boton">Evento de cambio de botón de opción</h3><!--kg-card-end: html--><p>Cuando un botón de opción está marcado o desmarcado, activa un <code>change</code>evento. Puedes escuchar este evento usando <code>addEventListener()</code>. Dentro del controlador de eventos, puede acceder al estado marcado y al valor del botón de opción usando <code>this.checked</code>y <code>this.value</code>.</p><pre><code class="language-javascript">radioButton.addEventListener('change', function (e) {
  if (this.checked) {
    console.log(this.value);
  }
});</code></pre><p><strong>Cómo generar dinámicamente botones de radio</strong></p><p>Ahora, exploremos cómo generar dinámicamente botones de opción usando JavaScript. Esto es útil cuando desea crear opciones de botones de opción dinámicamente según ciertos criterios o datos.</p><p>Supongamos que tenemos una variedad de idiomas y queremos generar dinámicamente botones de opción para cada opción de idioma:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;body&gt;
    &lt;div id="languages"&gt;&lt;/div&gt;

    &lt;script&gt;
      const languageOptions = ["Python", "Javascript", "C++", "Java"];

      // Generate the radio buttons
      const languages = document.querySelector("#languages");
      languages.innerHTML = languageOptions.map((language) =&gt; `
          &lt;div&gt;
              &lt;input type="radio" name="language" value="${language}" id="${language}"&gt;
              &lt;label for="${language}"&gt;${language}&lt;/label&gt;
          &lt;/div&gt;`).join(' ');
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Usamos el </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">map()</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">método para iterar sobre cada idioma en la matriz y generar HTML para el botón de opción y su etiqueta correspondiente.</font></font></figcaption></figure><p>Genera dinámicamente botones de opción basados ​​en la <code>languageOptions</code>matriz y los inserta en el elemento contenedor ( <code>&lt;div id="languages"&gt;&lt;/div&gt;</code>). Cada botón de opción tiene una identificación única y un valor correspondiente al nombre del idioma, y ​​las etiquetas están asociadas con sus respectivos botones de opción mediante el <code>for</code>atributo.</p><p>Después de generar dinámicamente los botones de opción, ahora agreguemos <code>change</code>detectores de eventos para manejar los cambios en la selección.</p><pre><code class="language-javascript">    &lt;!-- HTML --&gt;
    &lt;div id="languages"&gt;&lt;/div&gt;
    &lt;div id="languageOutput"&gt;&lt;/div&gt; // we create this one to fetch our selected language output
    
    &lt;!-- Generate the radio buttons --&gt;

// Attaching Change Event Listeners
const radioButtons = document.querySelectorAll('input[name="language"]');
for (const radioButton of radioButtons) {
    radioButton.addEventListener('change', showSelectedlanguage);
}        

// Handling the Change Event
function showSelectedlanguage() {
    if (this.checked) {
        document.querySelector('#languageOutput').innerText = `You selected ${this.value}`;
    }
}
</code></pre><p>Esto es lo que está pasando:</p><ul><li>Seleccionamos todos los botones de opción con el <code>name</code>atributo establecido en <code>"language"</code>.</li><li>Usamos un <code>for...of</code>bucle para iterar sobre cada botón de opción y agregamos un <code>change</code>detector de eventos a cada botón de opción. Este oyente escucha los cambios en el estado de los botones de opción, es decir, cuando se selecciona o deselecciona un botón de opción.</li><li>Definimos una función nombrada <code>showSelectedLanguage</code>para manejar el evento de cambio desencadenado al seleccionar un botón de opción.</li><li>Dentro de la <code>showSelectedLanguage</code>función, primero verificamos si el botón de opción actual ( <code>this</code>) está marcado usando la <code>checked</code>propiedad. Si el botón de opción está marcado, actualizamos el contenido de texto de un elemento con la identificación <code>languageOutput</code>usando <code>document.querySelector('#languageOutput')</code>. Este elemento sirve como marcador de posición para mostrar el idioma seleccionado.</li></ul><p>Esta configuración garantiza que los botones de opción generados dinámicamente tengan <code>change</code>detectores de eventos adjuntos, lo que permite el manejo dinámico de las selecciones del usuario.</p><!--kg-card-begin: html--><h2 id="casillas">Casillas de verificación</h2><!--kg-card-end: html--><h3 id="c-mo-crear-una-casilla-de-verificaci-n-html"><strong>Cómo crear una casilla de verificación HTML</strong></h3><p>Primero creemos una casilla de verificación usando el <code>&lt;input&gt;</code>elemento y escriba el atributo establecido en "casilla de verificación". asociémoslo con la etiqueta para una mejor accesibilidad.</p><pre><code class="language-html">&lt;label for="agree"&gt;
   &lt;input type="checkbox" id="agree" name="agree" value="yes"&gt; I agree to the terms
&lt;/label&gt;
</code></pre><!--kg-card-begin: html--><h3 id="comprobar">Cómo comprobar si una casilla de verificación está marcada</h3><!--kg-card-end: html--><p>Una casilla de verificación en HTML puede existir en dos estados: marcada y sin marcar. Y podemos determinar cuál está activo usando <code>checked</code>la propiedad. Si es así <code>true</code>, la casilla de verificación está marcada; de lo contrario, no está marcada. Ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
    &lt;label for="agree"&gt;
        &lt;input type="checkbox" id="agree" name="agree"&gt; I agree to the terms
    &lt;/label&gt;

    &lt;script&gt;
        const checkbox = document.getElementById('agree');
        console.log(checkbox.checked);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">marque o desmarque las casillas y actualice la página para ver el resultado</font></font></figcaption></figure><!--kg-card-begin: html--><h3 id="obtener-valores">Cómo obtener valores de casilla de verificación</h3><!--kg-card-end: html--><p>En los formularios HTML, cuando se marca una casilla de verificación y se envía el formulario, el navegador incluye la casilla de verificación en los datos del formulario con su <code>name</code>atributo como clave y el <code>value</code>atributo (si se especifica) como valor. Pero si la casilla de verificación no está marcada, no se incluye en absoluto en los datos del formulario.</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;label for="agree"&gt;
    &lt;input type="checkbox" id="agree" name="agree"&gt; I agree to the terms
&lt;/label&gt;

&lt;button id="btn"&gt;Show Value&lt;/button&gt;
&lt;script&gt;
    const checkbox = document.querySelector('#agree');
    const btn = document.querySelector('#btn');
    btn.onclick = () =&gt; {
       alert(checkbox.value);
    };
&lt;/script&gt;
</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Marque o desmarque, siempre mostrará el valor </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">'on'</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">ya que no hay ningún atributo de valor</font></font></figcaption></figure><p>Básicamente, el punto es: cuando se marca una casilla de verificación y se incluye en los envíos de formularios, el navegador envía <code>'on'</code>de forma predeterminada el valor si no <code>value</code>se define explícitamente ningún atributo para el elemento de entrada de la casilla de verificación. Para manejar con precisión el estado marcado de una casilla de verificación usando JavaScript, use la <code>checked</code>propiedad en lugar de confiar únicamente en el <code>value</code>atributo.</p><!--kg-card-begin: html--><h3 id="manejar-varias">Cómo manejar varias casillas de verificación</h3><!--kg-card-end: html--><p>A veces, es posible que necesite trabajar con varias casillas de verificación con el mismo nombre y desee recuperar los valores de las casillas de verificación seleccionadas. He aquí un ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;body&gt;
    &lt;p&gt;Select your preferred languages:&lt;/p&gt;
    &lt;label for="l1"&gt;
      &lt;input type="checkbox" name="language" value="C++" id="l1" /&gt;C++
    &lt;/label&gt;
    &lt;label for="l2"&gt;
      &lt;input type="checkbox" name="language" value="Python" id="l2" /&gt;Python
    &lt;/label&gt;
    &lt;label for="l3"&gt;
      &lt;input type="checkbox" name="language" value="Java" id="l3" /&gt;Java
    &lt;/label&gt;
    &lt;p&gt;
      &lt;button id="btn"&gt;Get Selected Languages&lt;/button&gt;
    &lt;/p&gt;

    &lt;script&gt;
      const btn = document.querySelector("#btn");
      btn.addEventListener("click", () =&gt; {
        const checkboxes = document.querySelectorAll(
          'input[name="language"]:checked'
        );
        const selectedLanguages = Array.from(checkboxes).map(
          (checkbox) =&gt; checkbox.value
        );
        alert("Selected Languages: " + selectedLanguages.join(", "));
      });
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Este enfoque permite a los usuarios seleccionar múltiples opciones y recuperar sus valores colectivamente.</font></font></figcaption></figure><p>En este ejemplo, tenemos casillas de verificación para seleccionar lenguajes de programación preferidos.</p><ul><li>Cuando se hace clic en el botón, se activa un detector de eventos. Dentro del detector de eventos, seleccionamos todas las casillas con el atributo de nombre "idioma" que estén marcadas.</li><li>Luego convertimos la NodeList devuelta por <code>querySelectorAll()</code>en una matriz usando <code>Array.from()</code>.</li><li>Finalmente, asignamos la matriz para recuperar los valores de las casillas de verificación seleccionadas y mostrarlos usando <code>alert()</code>.</li></ul><!--kg-card-begin: html--><h3 id="marcar-casillas">Cómo marcar/desmarcar todas las casillas de verificación</h3><!--kg-card-end: html--><p>Ahora, creemos una funcionalidad para marcar o desmarcar todas las casillas a la vez:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;body&gt;
    &lt;p&gt;
      &lt;button id="btn"&gt;Check / Uncheck All&lt;/button&gt;
    &lt;/p&gt;
    &lt;p&gt;Select your preferred languages:&lt;/p&gt;
    &lt;label for="l1"&gt;
      &lt;input type="checkbox" name="language" value="C++" id="l1" /&gt;C++
    &lt;/label&gt;
    &lt;label for="l2"&gt;
      &lt;input type="checkbox" name="language" value="Python" id="l2" /&gt;Python
    &lt;/label&gt;
    &lt;label for="l3"&gt;
      &lt;input type="checkbox" name="language" value="Java" id="l3" /&gt;Java
    &lt;/label&gt;
    &lt;script src="script.js"&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>Código javascript:</p><pre><code class="language-javascript">// function to check or uncheck all checkboxes
function check(checked = true) {
  const checkboxes = document.querySelectorAll('input[name="language"]');

  // Iterate through each checkbox
  checkboxes.forEach((checkbox) =&gt; {
    // Set the checked property of each checkbox to the value of the 'checked' parameter
    checkbox.checked = checked;
  });
}

// function to check all checkboxes and change button behavior to uncheck all
function checkAll() {
  check();
  this.onclick = uncheckAll;
}

// function to uncheck all checkboxes and change button behavior to check all
function uncheckAll() {
  check(false);
  this.onclick = checkAll;
}

const btn = document.querySelector("#btn");

btn.onclick = checkAll;
</code></pre><p>En este ejemplo, tenemos un botón llamado "Marcar/Desmarcar todo".</p><ul><li>Cuando se hace clic en el botón por primera vez, se pretende marcar todas las casillas de verificación. Por lo tanto, <code>checkAll</code>se asigna la función para manejar esta acción ( <code>const btn = document.querySelector("#btn");</code>).</li><li>Si se vuelve a hacer clic en el botón, se desmarcan todas las casillas de verificación. Definimos funciones <code>check()</code>, <code>checkAll()</code>y <code>uncheckAll()</code>para manejar la marcación y desmarcación de casillas de verificación.</li><li>Inicialmente asignamos <code>checkAll()</code>el evento del botón <code>onclick</code>y luego cambiamos entre <code>checkAll()</code>y <code>uncheckAll()</code>según el estado actual de las casillas de verificación.</li></ul><p>El enfoque alternativo podría ser:</p><pre><code class="language-javascript">function checkAll(checked = true) {
  const checkboxes = document.querySelectorAll('input[name="language"]');
  checkboxes.forEach((checkbox) =&gt; {
    checkbox.checked = checked;
  });
}

const btn = document.querySelector("#btn");

btn.addEventListener("click", () =&gt; {
  // Find the first checkbox with the name attribute set to 'language'
  const firstCheckbox = document.querySelector('input[name="language"]');
  // Check if the first checkbox is checked
  const isChecked = firstCheckbox.checked;
  // Call the checkAll function with the opposite state of the first checkbox
  checkAll(!isChecked);
});
</code></pre><p>Aquí, seleccionamos la primera casilla de verificación con el nombre "idioma" para determinar su estado actual marcado. Luego llamamos <code>checkAll()</code>con el estado opuesto.</p><!--kg-card-begin: html--><h3 id="generar-casillas">Cómo generar casillas de verificación dinámicamente</h3><!--kg-card-end: html--><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;body&gt;
    &lt;div id="languages"&gt;&lt;/div&gt;

    &lt;script&gt;
      const languageOptions = ["Python", "Javascript", "C++", "Java"];

      // Generate the checkboxes
      const html = languageOptions
        .map(
          (language) =&gt; `&lt;label for="language-${language}"&gt;
                &lt;input type="checkbox" name="language" id="language-${language}" value="${language}"&gt; ${language}
            &lt;/label&gt;`
        )
        .join(" ");
      document.querySelector("#languages").innerHTML = html;
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Cuando se carga la página, JavaScript genera dinámicamente las casillas de verificación basadas en la </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">languageOptions</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">matriz y las inserta en el </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">div</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">elemento con la identificación </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">languages</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">.</font></font></figcaption></figure><p>Así es como funciona:</p><ul><li>Definimos una matriz <code>languageOptions</code>que contiene nombres de idiomas.</li><li>Usamos el <code>map()</code>método para recorrer la <code>languageOptions</code>matriz y generar una matriz de cadenas HTML para cada idioma.</li><li>Cada cadena HTML comprende un <code>label</code>elemento asociado con una <code>input</code>casilla de verificación. La <code>input</code>casilla de verificación incluye atributos apropiados como <code>type</code>, <code>name</code>, <code>id</code>y <code>value</code>, derivados dinámicamente del nombre del idioma.</li><li>Unimos la matriz de cadenas HTML en una sola cadena usando <code>join(' ')</code>.</li><li>Finalmente, configuramos la <code>innerHTML</code>propiedad del <code>&lt;div&gt;</code>elemento raíz con la identificación <code>languages</code>de la cadena HTML generada, representando así casillas de verificación para cada lenguaje de programación.</li></ul><!--kg-card-begin: html--><h2 id="elemento">Seleccionar elemento:</h2><!--kg-card-end: html--><p>El <code>&lt;select&gt;</code>elemento en HTML proporciona una lista desplegable de opciones para que los usuarios elijan. Permite selecciones únicas o múltiples. Ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">&lt;select id="cities"&gt;
    &lt;option value="JAI"&gt;Jaipur&lt;/option&gt;
    &lt;option value="DEL"&gt;New Delhi&lt;/option&gt;
    &lt;option value="UDR"&gt;Udaipur&lt;/option&gt;
    &lt;option value="MUM"&gt;Mumbai&lt;/option&gt;
&lt;/select&gt;
</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">En este ejemplo, los usuarios pueden seleccionar una ciudad de la lista desplegable.</font></font></figcaption></figure><p>Por defecto, un <code>&lt;select&gt;</code>elemento permite una única selección. Para habilitar selecciones múltiples, agregue el <code>multiple</code>atributo.</p><pre><code class="language-javascript">&lt;select id="cities" multiple&gt;</code></pre><p>Los usuarios ahora pueden seleccionar varias frutas manteniendo presionada la tecla Ctrl (o Cmd en Mac) mientras hacen clic.</p><!--kg-card-begin: html--><h3 id="interactuar-elemento">Cómo interactuar con un elemento seleccionado:</h3><!--kg-card-end: html--><p>Para interactuar con un <code>&lt;select&gt;</code>elemento usando JavaScript, usamos el <code>HTMLSelectElement</code>tipo, que proporciona propiedades útiles como <code>selectedIndex</code>y <code>value</code>. Ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;script&gt;
const selectElement = document.getElementById('cities');
console.log(selectElement.selectedIndex); // Returns the index of the selected option
console.log(selectElement.value); // Returns the value of the selected option
console.log(selectElement.multiple); // Returns true if multiple selections are allowed
&lt;/script&gt;</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Estas propiedades ayudan a recuperar información sobre las opciones seleccionadas y el estado del </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">&lt;select&gt;</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">elemento.</font></font></figcaption></figure><p>JavaScript le permite manejar eventos en el <code>&lt;select&gt;</code>elemento, como cuando un usuario selecciona una opción. Ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">&lt;button id="btn"&gt;Get Selected City&lt;/button&gt;
    &lt;script&gt;
      const btn = document.querySelector("#btn");
      const selectElement = document.getElementById("cities");
      btn.onclick = (event) =&gt; {
        event.preventDefault();
        const selectedCity =
          selectElement.options[selectElement.selectedIndex].text;
        alert(`Selected city: ${selectedCity}, 
        Index: ${selectElement.selectedIndex}`);
      };
    &lt;/script&gt;</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Este script muestra la ciudad seleccionada y su índice cuando se hace clic en un botón.</font></font></figcaption></figure><p><strong><strong>Usando la <code>value</code>propiedad:</strong></strong> La <code>value</code>propiedad representa el valor de la opción seleccionada. Entendámoslo con el ejemplo:</p><pre><code class="language-html">&lt;select id="cities"&gt;
    &lt;option value=""&gt;Jaipur&lt;/option&gt; 
    &lt;option value="DEL"&gt;New Delhi&lt;/option&gt;
    &lt;option value="UDR"&gt;Udaipur&lt;/option&gt;
    &lt;option&gt;Mumbai&lt;/option&gt;
&lt;/select&gt;</code></pre><pre><code class="language-javascript">const btn = document.querySelector("#btn");
const selectElement = document.querySelector("#cities");

btn.onclick = (event) =&gt; {
    event.preventDefault();
    alert(selectElement.value);
};
</code></pre><ul><li>Si se selecciona "Jaipur", esto significa que tenemos una cadena vacía ya que el atributo de valor está vacío en nuestro HTML.</li><li>Si una opción carece de un atributo de valor, la propiedad de valor del cuadro de selección se convierte en el texto de la opción seleccionada. Ejemplo: si se selecciona "Mumbai", la propiedad de valor es "Mumbai".</li><li>Si se seleccionan varias opciones, la <code>value</code>propiedad del cuadro de selección se deriva de la primera opción seleccionada según las reglas anteriores.</li></ul><!--kg-card-begin: html--><h3 id="acceder">Cómo acceder a las opciones con JavaScript</h3><!--kg-card-end: html--><p>El <code>HTMLOptionElement</code>tipo representa <code>&lt;option&gt;</code>elementos individuales dentro de un <code>&lt;select&gt;</code>elemento en JavaScript. Proporciona propiedades como <code>index</code>, <code>selected</code>, <code>text</code>y <code>value</code>para acceder a información sobre cada opción.</p><pre><code class="language-javascript">const selectElement = document.getElementById('cities');
const secondOptionText = selectElement.options[1].text; // Accessing text of the second option
const secondOptionValue = selectElement.options[1].value; // Accessing value of the second option
</code></pre><!--kg-card-begin: html--><h3 id="manejar">Cómo manejar selecciones múltiples:</h3><!--kg-card-end: html--><p>Cuando un <code>&lt;select&gt;</code>elemento permite selecciones múltiples, puede recorrer sus opciones para encontrar cuáles están seleccionadas y recuperar sus valores de texto.</p><pre><code class="language-javascript">const selectElement = document.getElementById('cities');
const selectedOptions = Array.from(selectElement.options).filter(option =&gt; option.selected);
const selectedValues = selectedOptions.map(option =&gt; option.text); </code></pre><p>El resultado será una matriz que contiene texto de las opciones seleccionadas. En su lugar, podemos usarlo <code>option.value</code>para obtener una matriz de valores. Ejemplo:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;body&gt;
    &lt;select id="cities" multiple&gt;
      &lt;option value="JAI"&gt;Jaipur&lt;/option&gt;
      &lt;option value="DEL"&gt;New Delhi&lt;/option&gt;
      &lt;option value="UDR"&gt;Udaipur&lt;/option&gt;
      &lt;option value="MUM"&gt;Mumbai&lt;/option&gt;
    &lt;/select&gt;

    &lt;button id="btn"&gt;Get Selected Cities&lt;/button&gt;
    &lt;script&gt;
      const btn = document.querySelector("#btn");
      const selectElement = document.querySelector("#cities");

      btn.onclick = (event) =&gt; {
        event.preventDefault();
        const selectedOptions = Array.from(selectElement.options)
          .filter((option) =&gt; option.selected)
          .map((option) =&gt; option.text);
        alert("Selected City: " + selectedOptions.join(", "));
      };
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><ul><li>Cuando se hace clic en el botón, el script recopila las opciones seleccionadas filtrando las opciones según la <code>selected</code>propiedad. Luego asigna las opciones seleccionadas para recuperar su contenido de texto.</li><li>Finalmente, muestra los idiomas seleccionados en un mensaje de alerta.</li></ul><!--kg-card-begin: html--><h3 id="admi-tareas">Veamos un ejemplo: Administrador de tareas (Agregar y quitar tareas)</h3><!--kg-card-end: html--><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;style&gt;
    #container {
      max-width: 540px;
      margin: 50px auto;
    }

    form {
      display: flex;
      flex-direction: column;
    }
  &lt;/style&gt;
  &lt;body&gt;
    &lt;div id="container"&gt;
      &lt;form&gt;
        &lt;label for="task"&gt;Task:&lt;/label&gt;
        &lt;input
          type="text"
          id="task"
          placeholder="Enter a task"
          autocomplete="off"
        /&gt;

        &lt;button id="btnAdd"&gt;Add Task&lt;/button&gt;

        &lt;label for="taskList"&gt;Task List:&lt;/label&gt;
        &lt;select id="taskList" name="taskList" multiple&gt;&lt;/select&gt;

        &lt;button id="btnRemove"&gt;Remove Selected Tasks&lt;/button&gt;
      &lt;/form&gt;
    &lt;/div&gt;
    &lt;script src="script.js"&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>Esta estructura HTML incluye campos de entrada para ingresar descripciones de tareas, botones para agregar y eliminar tareas y un <code>&lt;select&gt;</code>elemento para mostrar la lista de tareas. Agregamos un poco de CSS para mayor claridad. Veamos el código Javascript ahora:</p><pre><code class="language-javascript">const btnAdd = document.querySelector('#btnAdd');
const btnRemove = document.querySelector('#btnRemove');
const taskList = document.querySelector('#taskList');
const taskInput = document.querySelector('#task');

btnAdd.onclick = (e) =&gt; {
    e.preventDefault();

    // Validate the task input
    if (taskInput.value.trim() === '') {
        alert('Please enter a task description.');
        return;
    }

    // Create a new task option
    const option = new Option(taskInput.value, taskInput.value);
    taskList.add(option, undefined);

    // Reset the task input
    taskInput.value = '';
    taskInput.focus();
};

btnRemove.onclick = (e) =&gt; {
    e.preventDefault();

    // Save the selected tasks
    let selectedTasks = [];

    for (let i = 0; i &lt; taskList.options.length; i++) {
        selectedTasks[i] = taskList.options[i].selected;
    }

    // Remove selected tasks
    let index = taskList.options.length;
    while (index--) {
        if (selectedTasks[index]) {
            taskList.remove(index);
        }
    }
};
</code></pre><p>Explicación: seleccionamos los elementos necesarios del HTML y adjuntamos detectores de eventos a los botones "Agregar tarea" y "Eliminar tareas seleccionadas". Cuando se hace clic en el botón "Agregar tarea", creamos una nueva opción de tarea basada en el valor del campo de entrada y la agregamos al <code>&lt;select&gt;</code>elemento. Cuando se hace clic en el botón "Eliminar tareas seleccionadas", eliminamos las tareas seleccionadas del <code>&lt;select&gt;</code>elemento.</p><!--kg-card-begin: html--><h2 id="diferencia">Diferencia entre cambio y evento de entrada</h2><!--kg-card-end: html--><p>El evento de entrada en JavaScript se activa cada vez que cambia el valor de una entrada, <code>&lt;select&gt;</code>o <code>&lt;textarea&gt;</code>elemento. A diferencia del evento de cambio, que espera a que se confirme un valor (por ejemplo, cuando una entrada pierde el foco), el evento de entrada se activa continuamente a medida que cambia el valor. El evento de entrada básicamente proporciona una forma de responder a la entrada del usuario en tiempo real. Ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
    &lt;label for="userInput"&gt;Enter Your Name:&lt;/label&gt;
    &lt;input type="text" id="userInput" placeholder="Your name"&gt;
    &lt;p&gt;Your name is: &lt;span id="displayName"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Este HTML configura una página web simple con un campo de entrada para que el usuario ingrese su nombre y un elemento de párrafo donde mostraremos el nombre ingresado dinámicamente.</font></font></figcaption></figure><pre><code class="language-javascript">&lt;script&gt;
    const userInput = document.getElementById('userInput');
    const Name = document.getElementById('displayName');

    userInput.addEventListener('input', function() {
        Name.textContent = userInput.value || 'Guest!';
    });
&lt;/script&gt;</code></pre><ul><li>Este código JavaScript selecciona el campo de entrada con el ID "userInput" y el elemento span con el ID "displayName".</li><li>Se adjunta un detector de eventos al evento de entrada del campo userInput.</li><li>Cuando se activa el evento de entrada (por ejemplo, al escribir en el campo de entrada), el controlador de eventos actualiza el contenido de texto del <code>displayName</code>intervalo dinámicamente para reflejar el nombre ingresado, o muestra "Anónimo" si el campo de entrada está vacío.</li><li>Ahora, si cambia 'entrada' por 'cambiar' aquí <code>userInput.addEventListener('input', function()</code>de esta manera: <code>userInput.addEventListener('change', function()</code>, el detector de eventos se activará solo cuando el campo de entrada pierda el foco después de que se haya ingresado un valor (en lugar de hacerlo continuamente mientras el valor se cambia en realidad). tiempo).</li></ul><!--kg-card-begin: html--><h2 id="conclusion">Conclusión</h2><!--kg-card-end: html--><p>Al comprender los fundamentos de los elementos, atributos y eventos de los formularios HTML, puede crear formularios web dinámicos y fáciles de usar que mejoran la experiencia del usuario.</p><p>JavaScript juega un papel crucial en el manejo de envíos de formularios, validar las entradas de los usuarios y proporcionar comentarios en tiempo real a los usuarios.</p><p>A través de ejemplos prácticos y explicaciones detalladas, en esta guía ha aprendido a trabajar con botones de opción, casillas de verificación, elementos de selección y a manejar selecciones múltiples.</p><p>Continúe explorando y experimentando con los conceptos presentados aquí para crear formularios sólidos e intuitivos para sus aplicaciones web.<br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo utilizar el operador ternario en JavaScript: explicado con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ ¿Estás cansado de declaraciones voluminosas sí o si no? El operador ternario de JavaScript ofrece una solución poderosa. Esta práctica herramienta le permite condensar lógica condicional compleja en una sola línea, haciendo que su código sea más limpio, elegante y eficiente. En este artículo, profundizaremos en el operador ternario, comprenderemos ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-utilizar-el-operador-ternario-en-javascript-explicado-con-ejemplos/</link>
                <guid isPermaLink="false">661f14261238a40479c59384</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ener Octavio Buitrago Camelo ]]>
                </dc:creator>
                <pubDate>Sun, 05 May 2024 00:38:53 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/04/ternary-operator-1-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/javascript-ternary-operator-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use the Ternary Operator in JavaScript – Explained with Examples</a>
      </p><p>¿Estás cansado de declaraciones voluminosas sí o si no? El operador ternario de JavaScript ofrece una solución poderosa. Esta práctica herramienta le permite condensar lógica condicional compleja en una sola línea, haciendo que su código sea más limpio, elegante y eficiente.</p><p>En este artículo, profundizaremos en el operador ternario, comprenderemos su sintaxis y mostraremos ejemplos del mundo real para ayudarlo a comprender cómo funciona para aprovechar todo su potencial.</p><h2 id="esto-es-lo-que-cubriremos-"><strong>Esto es lo que cubriremos:</strong></h2><ol><li><a href="#que-es">¿Qué es un operador ternario?</a></li><li><a href="#utilizar">Cómo utilizar el operador ternario</a></li><li><a href="#refactorizar">Cómo refactorizar declaraciones if-else al operador ternario</a></li><li><a href="#encadenar">Cómo encadenar operadores ternarios</a></li><li><a href="https://www.freecodecamp.org/news/javascript-ternary-operator-explained/#best-practices-when-using-the-ternary-operator">Mejores prácticas al utilizar el operador ternario</a></li><li><a href="#conclusion">Conclusión</a></li></ol><!--kg-card-begin: html--><h2 id="que-es">¿Qué es un operador ternario?</h2><!--kg-card-end: html--><p>Un operador ternario es un operador condicional en JavaScript que evalúa una expresión condicional y devuelve un valor verdadero o falso.</p><p>Para entender cómo funciona esto, echemos un vistazo más de cerca a su sintaxis a continuación:</p><pre><code class="language-js">conditionalExpression ? truthyValue : falsyValue</code></pre><p>Según la sintaxis anterior, es <code>condionalExpression</code>la expresión que sirve como punto de evaluación, determinando un valor verdadero o falso.</p><p>Después del <code>?</code>(signo de interrogación), se devuelve el valor proporcionado en caso de que la expresión se evalúe como verdadera, mientras que el valor que sigue a <code>:</code>(dos puntos) se devuelve si la expresión da como resultado un resultado falso.</p><p>El <code>truthyValue</code>y <code>falsyValue</code>puede ser cualquier cosa en JavaScript. Puede abarcar varias entidades como funciones, valores almacenados en variables, objetos, números, cadenas y más. El operador ternario le otorga la flexibilidad de devolver cualquier valor deseado, ofreciendo versatilidad en su código.</p><!--kg-card-begin: html--><h2 id="utilizar">Cómo utilizar el operador ternario</h2><!--kg-card-end: html--><p>Ahora que hemos examinado la sintaxis y su funcionalidad, exploremos cómo utilizar el operador ternario para profundizar nuestra comprensión.</p><p>Considere este escenario: estamos creando una plataforma de juegos que solo permite usuarios mayores de 18 años. Diseñaremos una función para comprobar la edad de un usuario. Si son menores de 18 años, se les negará el acceso; de lo contrario, podrán acceder a la plataforma.</p><pre><code class="language-js">function canAccessPlatform(age) {
  const shouldAccess = age &gt;= 18 ? true : false;

  return shouldAccess;
}</code></pre><p>A partir del fragmento de código anterior, creamos una función, <code>canAccessPlatform</code>que evalúa si un usuario, representado por su <code>age</code> parámetro, cumple con el requisito para acceder a la plataforma.</p><p>Utiliza un operador ternario para determinar si la edad es 18 o más, asignando <code>true</code>si <code>shouldAccess</code>se cumple la condición y <code>false</code>en caso contrario. Finalmente, devuelve el valor de <code>shouldAccess</code>, indicando si el usuario puede acceder a la plataforma o no.</p><p>Si la edad es 18 años o más, la expresión se vuelve verdadera, por lo que el operador devuelve verdadero después de <code>?</code>. De lo contrario, devuelve falso. Este resultado se guarda en una variable y luego se devuelve desde la función.</p><p>Si bien este caso de uso básico simplifica el código y mejora la legibilidad al reemplazar bloques if-else innecesarios, es importante usarlo con moderación para evitar saturar y complicar el código. Más adelante, analizaremos las mejores prácticas para utilizar el operador ternario.</p><p>Aquí hay otro ejemplo que ilustra el uso del operador ternario. Crearemos una función para determinar si un número es par o impar. Consulte el fragmento de código a continuación:</p><pre><code class="language-js">function checkEvenOrOdd(number) {
  const result = number % 2 === 0 ? "even" : "odd";
  return result;
}

// Usage:
console.log(checkEvenOrOdd(4)); // Output: "even"
console.log(checkEvenOrOdd(7)); // Output: "odd"</code></pre><p>Del fragmento de código anterior:</p><ul><li>Definimos una función <code>checkEvenOrOdd</code>que toma un <code>number</code>parámetro.</li><li>Dentro de la función usamos el operador ternario para comprobar si el número es par o impar.</li><li>Si el número módulo 2 es igual a 0 (lo que significa que es divisible por 2 sin resto), entonces la condición se evalúa como verdadera y la cadena "par" se asigna a la <code>result</code>variable.</li><li>Si la condición se evalúa como falsa (lo que significa que el número es impar), se asigna la cadena "impar" <code>result</code>.</li><li>Finalmente, la función devuelve el valor de <code>result</code>, que indica si el número es par o impar.</li></ul><p>Este código muestra cómo el operador ternario verifica rápidamente si un número es par o impar, lo que hace que el código sea más fácil de leer y comprender.</p><!--kg-card-begin: html--><h2 id="refactorizar">Cómo refactorizar declaraciones if-else al operador ternario</h2><!--kg-card-end: html--><p>Una ventaja del operador ternario es evitar bloques if-else innecesarios, que pueden complicar la legibilidad y el mantenimiento del código. En esta sección, refactorizaremos algunas declaraciones if-else en operaciones ternarias, brindando una comprensión más clara de cómo usar operadores ternarios de manera efectiva.</p><p>Comencemos con nuestro primer ejemplo:</p><pre><code class="language-js">function decideActivity(weather) {
  let activity;

  if (weather === "sunny") {
    activity = "go out";
  } else {
    activity = "stay in";
  }

  console.log(activity);
}

// Usage
console.log(decideActivity("raining")); // Output: "stay in"
console.log(decideActivity("snowing")); // Output: "stay in"
console.log(decideActivity("sunny")); // Output: "go out"</code></pre><p>Esta función, <code>decideActivity</code>toma un <code>weather</code>parámetro y determina la actividad adecuada en función de las condiciones climáticas.</p><p>Si el tiempo es "soleado", sugiere "salir". En caso contrario, aconseja "quedarse en casa". Cuando llamamos a la función con diferentes condiciones climáticas como "lloviendo" o "nevando", genera la recomendación de actividad correspondiente usando <code>console.log()</code>.</p><p>Por ejemplo, al llamar <code>decideActivity("raining")</code>se obtendrá "permanecer en". Del mismo modo, <code>decideActivity("snowing")</code>también genera "permanecer en". Cuando <code>decideActivity("sunny")</code>se llama, el resultado es "salir". Esta sencilla función ayuda a decidir actividades en función de las condiciones climáticas proporcionadas.</p><p>Ahora podemos refactorizar estos bloques de código para que parezcan más simples y ordenados. Veamos cómo hacerlo a continuación:</p><pre><code class="language-js">function decideActivity(weather){
   const activity = weather === "sunny" ? "go out" ? "stay in";
   
   console.log(activity)

}

// Usage
console.log(decideActivity("raining")); // Output: "stay in"
console.log(decideActivity("snowing")); // Output: "stay in"
console.log(decideActivity("sunny")); // Output: "go out"</code></pre><p>Del ejemplo de código anterior, esta función <code>decideActivity</code>utiliza el operador ternario para determinar rápidamente la actividad en función de las condiciones climáticas. Comprueba si el tiempo es "soleado" y asigna "salir" si es cierto, en caso contrario "quedarse dentro".</p><p>Hemos simplificado las declaraciones if-else en un operador ternario de una sola línea. Esto hace que nuestro código sea más limpio, claro y fácil de leer.</p><p>Echemos un vistazo a otro ejemplo:</p><pre><code class="language-js">function checkNumber(number) {
  let result;
  if (number &gt; 0) {
    result = "positive";
  } else {
    result = "non-positive";
  }
  return result;
}

// Usage
console.log(checkNumber(5)); // Output: "positive"
console.log(checkNumber(-2)); // Output: "non-positive"
</code></pre><p>Expliquemos qué está haciendo el código anterior:</p><ul><li><strong><strong>Definición de función</strong></strong> : Comenzamos definiendo una función llamada <code>checkNumber</code>que toma un único parámetro llamado <code>number</code>.</li><li><strong><strong>Declaración de variable</strong></strong> : dentro de la función, declaramos una variable nombrada <code>result</code>sin asignarle ningún valor todavía. Esta variable almacenará el resultado de nuestra verificación.</li><li><strong><strong>Declaración condicional (if-else)</strong></strong> : tenemos una declaración condicional que verifica si el <code>number</code>parámetro es mayor que 0.</li><li>Si la condición es verdadera (lo que significa que el número es positivo), asignamos la cadena "positiva" a la <code>result</code>variable.</li><li>Si la condición es falsa (lo que significa que el número no es positivo (lo que significa que es negativo o cero), asignamos la cadena "no positivo" a la <code>result</code>variable.</li><li><strong><strong>Declaración de devolución</strong></strong> : finalmente, devolvemos el valor almacenado en la <code>result</code>variable.</li><li><strong><strong>Llamadas a funciones</strong></strong> : luego llamamos a la <code>checkNumber</code>función dos veces con diferentes argumentos: 5 y -2.</li></ul><p>Cuando llamamos <code>checkNumber(5)</code>, la función devuelve "positivo", que luego se registra en la consola.</p><p>De manera similar, cuando llamamos <code>checkNumber(-2)</code>, la función devuelve "no positivo", que nuevamente se registra en la consola.</p><p>Esta función determina de manera eficiente si un número es positivo o no positivo y proporciona el resultado apropiado según la condición.</p><p>Simplifiquemos y mejoremos el código reescribiéndolo usando un operador ternario.</p><pre><code class="language-js">function checkNumber(number) {
  const result = number &gt; 0 ? "positive" : "non-positive";
  return result;
}

// Usage
console.log(checkNumber(5)); // Output: "positive"
console.log(checkNumber(-2)); // Output: "non-positive"
</code></pre><p>¡Gran trabajo! Al refactorizar la función y utilizar el operador ternario para la evaluación condicional, logramos un código más limpio, conciso y legible.</p><p>Este código, que utiliza el operador ternario, parece más conciso y elegante. Determina de manera eficiente si un número es positivo o no positivo, lo que hace que el código sea más limpio y fácil de entender. Cuando llamamos <code>checkNumber(5)</code>, devuelve "positivo", mientras que <code>checkNumber(-2)</code>devuelve "no positivo". En general, el operador ternario mejora la legibilidad del código.</p><!--kg-card-begin: html--><h2 id="encadenar">Cómo encadenar operadores ternarios</h2><!--kg-card-end: html--><p>Cuando se trata de controles condicionales, a veces una sola condición no es suficiente. En tales casos, utilizamos declaraciones 'else-if' junto con 'if/else' para incorporar múltiples condiciones.</p><p>Echemos un vistazo a la sintaxis:</p><pre><code class="language-js">function exampleFn() {
  return conditionalExpression1
    ? value1
    : conditionalExpression2
    ? value2
    : conditionalExpression3
    ? value3
    : value4;
}</code></pre><p>Esto se puede traducir en una cadena if/else:</p><pre><code class="language-js">function exampleFn() {
  if (conditionalExpression1) {
    return value1;
  } else if (conditionalExpression2) {
    return value2;
  } else if (conditionalExpression3) {
    return value3;
  } else {
    return value4;
  }
}
</code></pre><p>Exploremos un ejemplo a continuación:</p><pre><code class="language-js">function checkNumber(number) {
  let message;

  if (number &gt; 0) {
    message = "Positive";
  } else if (number === 0) {
    message = "Zero";
  } else {
    message = "Negative";
  }

  return message;
}

// Usage
console.log(checkNumber(5)); // Output: "Positive"
console.log(checkNumber(0)); // Output: "Zero"
console.log(checkNumber(-3)); // Output: "Negative"
</code></pre><p>Este código anterior define una función llamada <code>checkNumber</code>que toma un <code>number</code>parámetro y determina su estado (positivo, cero o negativo). Utiliza un bloque if-else con una declaración else-if para evaluar el valor del número. Si el número es mayor que 0 se considera positivo y si es igual a 0 es cero. De lo contrario, es negativo. La función devuelve el resultado.</p><p>Refactoricemos este código usando un operador ternario para lograr la misma funcionalidad.</p><pre><code class="language-js">function checkNumber(number) {
  return number &gt; 0 ? "Positive" : number === 0 ? "Zero" : "Negative";
}

// Usage
console.log(checkNumber(5)); // Output: "Positive"
console.log(checkNumber(0)); // Output: "Zero"
console.log(checkNumber(-3)); // Output: "Negative"
</code></pre><p>¡Eso es todo! Hemos refactorizado la función y, tras un examen más detenido, podemos observar que los operadores están encadenados. Ahora, exploremos cómo funciona el operador ternario encadenado en la <code>checkNumber</code>función.</p><p>En el primer operador ternario:</p><ul><li>La primera parte <code>number &gt; 0</code>comprueba si el número es mayor que 0.</li><li>Si es verdadero, la expresión devuelve "Positivo".</li></ul><p>En el segundo operador ternario (encadenado):</p><ul><li>Si la primera condición es falsa (lo que significa que el número no es mayor que 0), pasa a la siguiente parte de la expresión: <code>number === 0</code>.</li><li>Esta parte comprueba si el número es igual a 0.</li><li>Si es verdadera, la expresión devuelve "Cero".</li></ul><p>Y el valor predeterminado:</p><ul><li>Si ninguna de las condiciones anteriores es verdadera (lo que significa que el número no es mayor que 0 ni igual a 0), el valor predeterminado es la última parte de la expresión: <code>"Negative"</code>.</li><li>Esta parte actúa como valor predeterminado si no se cumple ninguna de las condiciones anteriores.</li></ul><p>En resumen, el operador ternario encadenado evalúa múltiples condiciones en una sola línea de código. Comprueba cada condición secuencialmente y la primera condición que se evalúa como verdadera determina el resultado de toda la expresión. Esto permite una lógica condicional concisa y eficiente.</p><p>Examinemos otro ejemplo de operador ternario encadenado.</p><pre><code class="language-js">function getDrink(age) {
  return age &gt;= 21
    ? "Enjoy a cocktail"
    : age &gt;= 18
    ? "Have a beer"
    : age &gt;= 16
    ? "Grab a soft drink"
    : "Sorry, you're too young to drink";
}

// Usage
console.log(getDrink(25)); // Output: "Enjoy a cocktail"
console.log(getDrink(19)); // Output: "Have a beer"
console.log(getDrink(16)); // Output: "Grab a soft drink"
console.log(getDrink(10)); // Output: "Sorry, you're too young to drink"
</code></pre><p>En el ejemplo de código proporcionado, los operadores ternarios están encadenados para proporcionar diferentes sugerencias de bebidas según la edad proporcionada. Cada expresión condicional de la cadena evalúa un rango de edad específico.</p><p>Si la primera condición es verdadera (verdadera), devuelve 'Disfruta de un cóctel'. Si es falso (falso), pasa a la siguiente expresión condicional, y así sucesivamente. Este proceso de encadenamiento continúa hasta que una condición se evalúa como verdadera. Si ninguna de las condiciones de la cadena es verdadera, el último valor se devuelve como alternativa, similar al bloque "else" en una declaración if/else.</p><p>El concepto de "encadenar" operadores ternarios implica vincular expresiones condicionales en función del valor de la expresión anterior. Esto se puede comparar con la <code>else if</code>estructura de una <code>if/else</code>declaración, lo que proporciona una forma concisa de manejar múltiples condiciones en JavaScript.</p><!--kg-card-begin: html--><h2 id="practicar">Mejores prácticas al utilizar el operador ternario</h2><!--kg-card-end: html--><p>El uso eficiente del operador ternario puede mejorar significativamente la legibilidad y la concisión del código. En esta sección, exploraremos las mejores prácticas clave para utilizar el operador ternario de manera efectiva.</p><ol><li><strong><strong>Manténgalo simple y legible</strong></strong> : escriba expresiones concisas que sean fáciles de entender de un vistazo. Evite anidar demasiados operadores ternarios o escribir condiciones demasiado complejas.</li><li><strong><strong>Úselo para asignaciones simples:</strong></strong> los operadores ternarios son ideales para asignaciones simples donde solo hay dos resultados posibles según una condición. Para escenarios más complejos, considere usar <code>if/else</code>declaraciones.</li><li><strong><strong>Sepa cuándo usarlo</strong></strong> : use el operador ternario cuando necesite realizar una verificación condicional simple y asignar un valor según el resultado. Es particularmente útil para asignar valores predeterminados o determinar el valor de una variable en función de una condición.</li><li><strong><strong>Pruebe minuciosamente</strong></strong> : pruebe su código minuciosamente para asegurarse de que el operador ternario se comporte como se espera en diferentes condiciones. Verifique casos extremos y valide la exactitud de los valores asignados.</li><li><strong><strong>Evite los ternarios anidados:</strong></strong> si bien es posible encadenar ternarios, el anidamiento excesivo puede generar código difícil de leer. Prefiera claridad y considere usarlo <code>if/else</code>para condiciones complejas.</li><li><strong><strong>Mantenga los ternarios breves:</strong></strong> intente mantener las expresiones ternarias breves y concisas. Los ternarios largos pueden ser difíciles de leer y comprender, lo que genera desafíos de mantenimiento del código.</li></ol><p>Estas mejores prácticas describen pautas para utilizar eficazmente el operador ternario. Si bien no son reglas estrictas, ofrecen información valiosa para mejorar la claridad y legibilidad de su código.</p><!--kg-card-begin: html--><h2 id="conclusion">Conclusión</h2><!--kg-card-end: html--><p>Al concluir este artículo, obtendrá una comprensión integral del operador ternario: su aplicación en tareas diarias de codificación, conversión de declaraciones if/else, operadores de encadenamiento y mejores prácticas. Estoy seguro de que ha adquirido conocimientos valiosos que mejorarán sus prácticas de codificación utilizando el operador ternario.</p><p>¡Gracias por leer y hasta la próxima!</p><h3 id="informaci-n-del-contacto"><strong>Información del contacto</strong></h3><p>¿Quieres ponerte en contacto conmigo? No dudes en comunicarte a través de cualquiera de los siguientes canales:</p><ul><li>Twitter / X: <a href="https://twitter.com/developeraspire">@developeraspire</a></li><li>Correo electrónico: desarrolladoraspire5@gmail.com</li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial del botón de alternancia SVG: cómo manejar el modo oscuro con CSS y JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ ¿Cómo se puede detectar el modo oscuro en CSS y JavaScript? ¿Cómo puedes anularlo manualmente con un botón de alternancia? ¿Y cómo se puede crear un ícono de sol y luna con SVG? En este tutorial, aprenderá cómo detectar el modo oscuro en CSS y JavaScript, y creará un botón ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-del-boton-de-alternancia-svg-como-manejar-el-modo-oscuro-con-css-y-javascript/</link>
                <guid isPermaLink="false">661e84d21238a40479c592c1</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ener Octavio Buitrago Camelo ]]>
                </dc:creator>
                <pubDate>Sat, 04 May 2024 21:31:30 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/05/svg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-handle-dark-mode-with-css-and-javascript/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">SVG Toggle Button Tutorial – How to Handle Dark Mode with CSS and JavaScript</a>
      </p><p>¿Cómo se puede detectar el modo oscuro en CSS y JavaScript? ¿Cómo puedes anularlo manualmente con un botón de alternancia? ¿Y cómo se puede crear un ícono de sol y luna con SVG?</p><p>En este tutorial, aprenderá cómo detectar el modo oscuro en CSS y JavaScript, y creará un botón de alternancia con SVG para anular el comportamiento predeterminado. Utilizará HTML, CSS y JavaScript sin formato, por lo que no necesita ningún requisito preliminar antes de comenzar.</p><p>También puedes ver este artículo como vídeo en YouTube.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/GUSUA72t7p0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="How to Handle Dark Mode with CSS and JavaScript - SVG Toggle Button Tutorial" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="tabla-de-contenido"><strong>Tabla de contenido</strong></h2><ul><li><a href="#manejar">Cómo manejar el modo oscuro con CSS</a></li><li><a href="#codificar">Cómo codificar un icono de sol con SVG</a></li><li><a href="#detectar">Cómo detectar el modo oscuro en JavaScript</a></li><li><a href="#icono">Cómo codificar un icono de luna con SVG</a></li><li><a href="#alternar">Cómo alternar el modo oscuro con JavaScript</a></li><li><a href="#pasos">Próximos pasos</a></li></ul><!--kg-card-begin: html--><h2 id="manejar">Cómo manejar el modo oscuro con CSS</h2><!--kg-card-end: html--><p>Supongamos que tiene un sitio web sencillo con algo de texto. De forma predeterminada, configura el color del texto en negro y el color de fondo en blanco. Implementar el modo oscuro para este sitio con CSS es muy sencillo:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8" /&gt;
    &lt;title&gt;Dark Mode&lt;/title&gt;
    &lt;link rel="stylesheet" href="index.css" /&gt;
    &lt;script src="index.js" defer&gt;&lt;/script&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;p&gt;
      How to detect dark mode in CSS and in JavaScript? How can we override it
      manually with a toggle button? In this quick tutorial, we look into
      detecting dark mode in CSS and JavaScript, and then we create a toggle
      button with SVG to override the default behavior.
    &lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Screenshot-2024-03-07-at-11.33.28.png" class="kg-image" alt="Captura de pantalla-2024-03-07-at-11.33.28" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Un sitio web sencillo con algo de texto en modo oscuro.</font></font></figcaption></figure><p>Todo lo que necesitas hacer es agregar una consulta de medios y establecer una condición. Con esta condición, configura las siguientes declaraciones CSS para que solo sean válidas si el esquema de color preferido es oscuro.</p><p>Dentro de esta consulta de medios, puede definir los colores para el modo oscuro. En este caso, inviertes los colores y estableces el color del texto en blanco y el color de fondo en negro:</p><pre><code class="language-css">body {
  font-family: Montserrat;
  margin: 50px;
  max-width: 500px;
}

@media (prefers-color-scheme: dark) {
  body {
    background-color: black;
    color: white;
  }
}
</code></pre><p>Esto tomará la configuración de su sistema operativo o configuración del navegador. De forma predeterminada, proviene del sistema operativo, pero el navegador puede decidir anularlo. En Google Chrome, puede encontrar esta configuración en "Apariencia". De forma predeterminada, sigue la configuración del dispositivo.</p><p>Lo bueno de la solución CSS es que si cambia esta configuración mientras visita el sitio web, el estilo se actualizará automáticamente.</p><p>De esta manera, puede establecer un estilo personalizado para el elemento del cuerpo y también para cualquier otro elemento.</p><p>Sin embargo, en un caso no funciona. No puedes diseñar lo que hay dentro de un elemento HTML Canvas con CSS. Si creaste un <a href="https://www.freecodecamp.org/news/gorillas-game-in-javascript/">juego completamente desde JavaScript</a> usando Canvas API o Three.js, también debes configurar los colores para el modo oscuro en JavaScript.</p><p>En los próximos pasos, cubriremos esto y veremos cómo crear un botón de alternancia SVG para cambiar entre los modos claro y oscuro.</p><!--kg-card-begin: html--><h2 id="codificar">Cómo codificar un icono de sol con SVG</h2><!--kg-card-end: html--><p>Antes de aprender a manejar el modo oscuro en JavaScript, hagamos un desvío rápido y veamos cómo codificar un botón de alternancia del modo oscuro con SVG. Detectar el modo oscuro es una cosa, pero debes permitir al usuario alternar manualmente entre los modos claro y oscuro.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.022.png" class="kg-image" alt="Diapositivas-1.022" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Icono del sol</font></font></figcaption></figure><p>Consulte mi tutorial anterior si necesita una introducción rápida a <a href="https://www.freecodecamp.org/news/svg-tutorial-learn-to-code-images/">la codificación de iconos SVG</a> . Contiene muchos ejemplos excelentes, desde niveles principiantes hasta avanzados. Y si eres nuevo en los SVG, no te preocupes. Estos son ejemplos muy simples.</p><p>Entonces, comencemos con el <code>svg</code>elemento. Esto servirá como contenedor para todos los elementos de la imagen. Establezca su tamaño en 30 por 30:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.004.png" class="kg-image" alt="Diapositivas-1.004" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">El </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">svg</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">elemento</font></font></figcaption></figure><p>Luego, agrega un círculo. Para un <code>circle</code>elemento, debes establecer las coordenadas centrales del círculo y su radio. Las coordenadas centrales son 15 y el radio es 6. Luego, establece un color con la <code>fill</code>propiedad:</p><pre><code class="language-html">&lt;svg width="30" height="30"&gt;
  &lt;circle cx="15" cy="15" r="6" fill="currentColor" /&gt;
&lt;/svg&gt;</code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.006.png" class="kg-image" alt="Diapositivas-1.006" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Agregamos un </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">circle</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">como núcleo del sol.</font></font></figcaption></figure><p>Para establecer el color, puede utilizar la <code>currentColor</code>propiedad que asume la <code>color</code>configuración actual de CSS. Esto será útil más adelante cuando alterne los modos oscuro y claro. El icono cambiará de color automáticamente.</p><p>Luego, agrega los rayos del sol. Debe usar el <code>line</code>elemento para esto, donde debe establecer las coordenadas inicial y final. También puede establecer el color del trazo con la <code>stroke</code>propiedad <code>stroke-width</code>para agregar grosor y la <code>stroke-linecap</code>propiedad para redondear los extremos de las líneas:</p><pre><code class="language-html">&lt;svg width="30" height="30"&gt;
  &lt;circle cx="15" cy="15" r="6" fill="currentColor" /&gt;

  &lt;line
    id="ray"
    stroke="currentColor"
    stroke-width="2"
    stroke-linecap="round"
    x1="15"
    y1="1"
    x2="15"
    y2="4"
  &gt;&lt;/line&gt;
&lt;/svg&gt;</code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.010.png" class="kg-image" alt="Diapositivas-1.010" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Agregamos un </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">line</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">elemento como un rayo de sol.</font></font></figcaption></figure><p>Ahora, una vez que tengas un rayo, puedes reutilizar el mismo rayo para dibujar los demás.</p><p>Puedes darle a este rayo <code>id</code>y reutilizarlo con el <code>use</code>elemento. Para los elementos reutilizados, puede establecer una rotación. Establezca el ángulo de rotación y el centro de rotación. Quieres rotar los rayos alrededor del centro del sol, así que configúralo en <code>15,15</code>. Luego, incrementa la rotación en 45 grados para cada rayo:</p><pre><code class="language-html">&lt;svg width="30" height="30"&gt;
  &lt;circle cx="15" cy="15" r="6" fill="currentColor" /&gt;

  &lt;line
    id="ray"
    stroke="currentColor"
    stroke-width="2"
    stroke-linecap="round"
    x1="15"
    y1="1"
    x2="15"
    y2="4"
  &gt;&lt;/line&gt;

  &lt;use href="#ray" transform="rotate(45 15 15)" /&gt;
  &lt;use href="#ray" transform="rotate(90 15 15)" /&gt;
  &lt;use href="#ray" transform="rotate(135 15 15)" /&gt;
  &lt;use href="#ray" transform="rotate(180 15 15)" /&gt;
  &lt;use href="#ray" transform="rotate(225 15 15)" /&gt;
  &lt;use href="#ray" transform="rotate(270 15 15)" /&gt;
  &lt;use href="#ray" transform="rotate(315 15 15)" /&gt;
&lt;/svg&gt;</code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.016.png" class="kg-image" alt="Diapositivas-1.016" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">El icono del sol terminado.</font></font></figcaption></figure><!--kg-card-begin: html--><h2 id="detectar">Cómo detectar el modo oscuro en JavaScript</h2><!--kg-card-end: html--><p>Antes de llegar al ícono de la luna, veamos cómo detectar el modo oscuro en JavaScript. Esto puede ser útil al crear un juego, como lo hicimos hace un par de semanas en el tutorial del juego Gorilas JavaScript .</p><p>En ese juego, estábamos dibujando en un elemento HTML Canvas con JavaScript. Configuramos todos los colores con JavaScript. Si queremos admitir el modo oscuro, podemos configurar los colores en función de una <code>darkMode</code>variable. Pero ¿cómo detectamos si estamos en modo oscuro? ¿Cómo establecemos el valor de esta variable?</p><p>El siguiente código es un fragmento de ejemplo del tutorial del juego anterior. Aquí configuramos el color de relleno antes de dibujar un rectángulo en el lienzo. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.018.png" class="kg-image" alt="Diapositivas-1.018" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Al dibujar sobre un </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">canvas</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">elemento configuramos los colores desde JavaScript. ¿Pero cómo detectamos el modo oscuro?</font></font></figcaption></figure><p>Detectar el modo oscuro en JavaScript también es muy sencillo. Curiosamente, esta solución también depende de los selectores de consultas CSS que usaste antes.</p><p>Puedes crear un <code>matchMedia</code>objeto con la misma condición que usamos en CSS. Este método puede comprobar si el documento coincide con una consulta de medios. Pasar <code>prefers-color-scheme: dark</code>como argumento:</p><pre><code class="language-javascript">const darkModeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");

let darkMode = darkModeMediaQuery.matches;

. . .

function drawBuildings() {
  state.buildings.forEach((building) =&gt; {
    ctx.fillStyle = darkMode ? "#254D7E" : "#947285";
    ctx.fillRect(building.x, 0, building.width, building.height);
  });
}</code></pre><p>Luego, puede verificar la <code>matches</code>propiedad de este objeto. Si es cierto, entonces estás en modo oscuro. Puede guardar esto en una variable y, luego, puede usar esta variable para decidir qué colores debe usar al pintar en el elemento del lienzo.</p><p>Esta variable, sin embargo, no se actualiza automáticamente cuando cambia entre el modo claro y el modo oscuro. Debe agregar un detector de eventos que detecte si la configuración cambia.</p><p>Aquí, definimos una función que verifica la <code>matches</code>propiedad del objeto entrante para decidir si acaba de cambiar al modo brillante u oscuro:</p><pre><code class="language-javascript">const darkModeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");

let darkMode = darkModeMediaQuery.matches;

darkModeMediaQuery.addEventListener("change", (e) =&gt; {
  if (e.matches) {
    darkMode = true;
  } else {
    darkMode = false;
  }
});

. . .

function drawBuildings() {
  state.buildings.forEach((building) =&gt; {
    ctx.fillStyle = darkMode ? "#254D7E" : "#947285";
    ctx.fillRect(building.x, 0, building.width, building.height);
  });
}</code></pre><p>Ahora, si configuras los colores según esta <code>darkMode</code>variable, deberías ver que la apariencia del juego cambia una vez que cambias entre el modo claro y oscuro en la configuración del sistema operativo. Mira esta <a href="https://codepen.io/HunorMarton/pen/jOJZqvp">demostración</a> para verlo en acción.</p><!--kg-card-begin: html--><h2 id="icono">Cómo codificar un icono de luna con SVG</h2><!--kg-card-end: html--><p>Antes de discutir la anulación de la configuración predeterminada del sistema operativo con un botón de alternancia, examinemos la otra mitad de nuestro ícono de alternancia: Dibujemos una luna.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.023.png" class="kg-image" alt="Diapositivas-1.023" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Los iconos del Sol y la Luna</font></font></figcaption></figure><p>Comience con un <code>svg</code>elemento del mismo tamaño y defina una ruta dentro de él. Puede definir un <code>path</code>elemento estableciendo su <code>d</code>atributo. En este atributo, construyes una ruta a partir de una serie de comandos:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.026.png" class="kg-image" alt="Diapositivas-1.026" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Definimos a </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">path</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">con una serie de comandos</font></font></figcaption></figure><p>Comienza con el comando mover a para ir a la posición inicial. Este comando consta de la letra <code>M</code>y la coordenada inicial:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.027.png" class="kg-image" alt="Diapositivas-1.027" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Usando el comando mover a dentro de una ruta</font></font></figcaption></figure><p>Luego, usa un comando de arco para dibujar el arco exterior de la luna. Este comando puede dar un poco de miedo porque tiene varias propiedades. Veamos que tenemos:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.028.png" class="kg-image" alt="Diapositivas-1.028" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">El comando arco y sus varias propiedades.</font></font></figcaption></figure><p>Un comando siempre continúa el comando anterior, por lo que este arco dibujará el arco a partir de las coordenadas del comando de desplazamiento. Los comandos también terminan con las coordenadas del punto final.</p><p>Aquí estableces dónde termina el arco. El resto de las propiedades tratan sobre cómo dibujar un arco desde el punto inicial hasta el punto final:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.029.png" class="kg-image" alt="Diapositivas-1.029" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Las dos últimas propiedades del comando arco muestran el punto final del arco.</font></font></figcaption></figure><p>Las dos primeras propiedades son el radio horizontal y vertical de nuestro arco. En nuestro caso, queremos tener el arco de un círculo, por lo que establecemos el mismo valor para ambos. Con el tercer argumento, puedes establecer una rotación. Cuando ambos radios son iguales, esta propiedad no hace diferencia. Puedes dejarlo en cero:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.030.png" class="kg-image" alt="Diapositivas-1.030" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Radio horizontal y vertical del arco.</font></font></figcaption></figure><p>Luego, tenemos la propiedad de bandera de arco grande. Con esto, podrás decidir si ir por el camino largo o corto hasta nuestra coordenada final. Puedes ver que puedes llegar al punto final de múltiples maneras, incluso con los mismos radios.</p><p>Hay dos arcos: en el caso del primero, irás por el camino largo y en el caso del segundo, irás por el camino corto. Esta es una bandera, por lo que el valor aquí puede ser 0 o 1:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.032.png" class="kg-image" alt="Diapositivas-1.032" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">La bandera de arco grande decide si debemos llegar al punto final por el camino corto o por el largo.</font></font></figcaption></figure><p>Finalmente, está la bandera de barrido. Básicamente, esto establece si debes dibujar el arco en el sentido de las agujas del reloj o en el sentido contrario a las agujas del reloj. Las dos opciones se reflejan entre sí. En el primer caso, lo configuras en cero; en el segundo, lo configuras en uno:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.035.png" class="kg-image" alt="Diapositivas-1.035" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">La bandera de barrido decide si debemos ir en el sentido de las agujas del reloj o en el sentido contrario a las agujas del reloj.</font></font></figcaption></figure><p>Ahora que tienes un arco, configuras el otro. Aquí, establece el punto final al principio. A las mismas coordenadas que utilizó para el comando de desplazamiento.</p><p>Luego puedes usar los mismos radios, pero tienes que cambiar la bandera de arco grande y la bandera de barrido para terminar con una luna:</p><pre><code class="language-html">&lt;svg width="30" height="30"&gt;
  &lt;path
    fill="currentColor"
    d="
      M 23, 5
      A 12 12 0 1 0 23, 25
      A 12 12 0 0 1 23, 5"
  /&gt;
&lt;/svg&gt;</code></pre><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.039.png" class="kg-image" alt="Diapositivas-1.039" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">El ícono de la luna terminado.</font></font></figcaption></figure><p>¿Cómo puedes usar estos dos íconos en un botón para alternar el modo claro y el modo oscuro en JavaScript?</p><!--kg-card-begin: html--><h2 id="alternar">Cómo alternar el modo oscuro con JavaScript</h2><!--kg-card-end: html--><p>Si desea anular la configuración del sistema o del navegador para el modo oscuro con un cambio manual, ya no puede confiar en la consulta de medios CSS. Esto funciona para representar la interfaz de usuario según la configuración, pero no puede anularla desde JavaScript.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Slides-1.041.png" class="kg-image" alt="Diapositivas-1.041" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">No puedes anular una consulta de medios CSS</font></font></figcaption></figure><p>En su lugar, puede definir una <code>dark-mode</code>clase y alternarla desde JavaScript.</p><p>En CSS, defina una clase que cambiará la misma configuración que hizo antes la consulta de medios. Luego, en JavaScript, puedes usar la misma lógica que tenías antes para obtener la configuración predeterminada y luego agregar o eliminar esta clase.</p><p>Puede configurar esta clase en la carga de nuestra página inicial y alternarla si hace clic en un botón:</p><pre><code class="language-css">body {
  font-family: Montserrat;
  margin: 50px;
  max-width: 500px;
}

.dark-mode {
  background-color: black;
  color: white;
}</code></pre><p>Ahora, ¿cómo se alterna esto con un botón? En su archivo HTML, agregue un elemento de botón con un controlador de eventos. Luego, mueva ambos SVG dentro de este elemento de botón y asígneles ID. Alternará la visibilidad de estos íconos desde JavaScript:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8" /&gt;
    &lt;title&gt;Dark Mode&lt;/title&gt;
    &lt;link rel="stylesheet" href="index.css" /&gt;
    &lt;script src="index.js" defer&gt;&lt;/script&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;p&gt;
      How to detect dark mode in CSS and in JavaScript? How can we override it
      manually with a toggle button? In this quick tutorial, we look into
      detecting dark mode in CSS and JavaScript, and then we create a toggle
      button with SVG to override the default behavior.
    &lt;/p&gt;

    &lt;button onclick="toggleDarkMode()"&gt;
      &lt;svg width="30" height="30" id="light-icon"&gt;
        &lt;circle cx="15" cy="15" r="6" fill="currentColor" /&gt;

        &lt;line
          id="ray"
          stroke="currentColor"
          stroke-width="2"
          stroke-linecap="round"
          x1="15"
          y1="1"
          x2="15"
          y2="4"
        &gt;&lt;/line&gt;

        &lt;use href="#ray" transform="rotate(45 15 15)" /&gt;
        &lt;use href="#ray" transform="rotate(90 15 15)" /&gt;
        &lt;use href="#ray" transform="rotate(135 15 15)" /&gt;
        &lt;use href="#ray" transform="rotate(180 15 15)" /&gt;
        &lt;use href="#ray" transform="rotate(225 15 15)" /&gt;
        &lt;use href="#ray" transform="rotate(270 15 15)" /&gt;
        &lt;use href="#ray" transform="rotate(315 15 15)" /&gt;
      &lt;/svg&gt;
      &lt;svg width="30" height="30" id="dark-icon"&gt;
        &lt;path
          fill="currentColor"
          d="
          M 23, 5
          A 12 12 0 1 0 23, 25
          A 12 12 0 0 1 23, 5"
        /&gt;
      &lt;/svg&gt;
    &lt;/button&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Mueva ambos íconos SVG a un </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">button</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">elemento y establezca uno único </font></font><code style="box-sizing: inherit; margin: 0px; padding: 0px 5px 2px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400 !important; font-stretch: inherit; line-height: 1em; font-family: &quot;Roboto Mono&quot;, monospace; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 0.8em; vertical-align: baseline; background: var(--gray15);">id</code><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">para cada uno</font></font></figcaption></figure><p>También puede desarmar la apariencia predeterminada del elemento del botón en CSS, excepto la propiedad del cursor. Deberías tener eso como puntero:</p><pre><code class="language-css">. . .

button {
  all: unset;
  cursor: pointer;
}

. . .</code></pre><p>Ahora, implementemos el controlador de eventos en JavaScript. Primero necesitas acceder a los íconos SVG por ID:</p><pre><code class="language-js">const lightIcon = document.getElementById("light-icon");
const darkIcon = document.getElementById("dark-icon");

. . .</code></pre><p>Luego, agregue la <code>dark-mode</code>clase al <code>body</code>elemento en caso de que esté en modo oscuro y oculte uno de los íconos SVG según la <code>darkMode</code>variable. Detectas el modo oscuro como lo hiciste antes:</p><pre><code class="language-js">. . .

// Check if dark mode is preferred
const darkModeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
let darkMode = darkModeMediaQuery.matches;

// Set dark-mode class on body if darkMode is true and pick icon
if (darkMode) {
  document.body.classList.add("dark-mode");
  darkIcon.setAttribute("display", "none");
} else {
  lightIcon.setAttribute("display", "none");
}

. . .</code></pre><p>Y finalmente, podemos implementar la función que invierte la <code>darkMode</code>propiedad. Esta función alterna la <code>dark-mode</code>clase en el elemento del cuerpo y alterna los íconos SVG:</p><pre><code class="language-js">. . .

// Toggle dark mode on button click
function toggleDarkMode() {
  // Toggle darkMode variable
  darkMode = !darkMode;

  // Toggle dark-mode class on body
  document.body.classList.toggle("dark-mode");

  // Toggle light and dark icons
  if (darkMode) {
    lightIcon.setAttribute("display", "block");
    darkIcon.setAttribute("display", "none");
  } else {
    lightIcon.setAttribute("display", "none");
    darkIcon.setAttribute("display", "block");
  }
}</code></pre><p>Ahora, esto funciona: de forma predeterminada, todavía tienes la configuración del sistema operativo o del navegador. Pero una vez que haga clic en este botón, lo anulará manualmente.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Screenshot-2024-03-07-at-12.31.42.png" class="kg-image" alt="Captura de pantalla-2024-03-07-at-12.31.42" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Aspecto final en modo claro.</font></font></figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2024/03/Screenshot-2024-03-07-at-12.31.27.png" class="kg-image" alt="Captura de pantalla-2024-03-07-at-12.31.27" width="600" height="400" loading="lazy"><figcaption><font style="box-sizing: inherit; vertical-align: inherit;"><font style="box-sizing: inherit; vertical-align: inherit;">Aspecto final en modo oscuro</font></font></figcaption></figure><!--kg-card-begin: html--><h2 id="pasos">Próximos pasos</h2>
<!--kg-card-end: html--><p>Con todo esto en su lugar, tiene una funcionalidad que toma la configuración del modo oscuro del navegador o del sistema operativo de forma predeterminada, y puede anularla con un atractivo botón de alternancia. En la <a href="https://youtu.be/GUSUA72t7p0">versión de YouTube de este tutorial</a> , también puede aprender cómo <code>localStorage</code>guardar esta configuración para la próxima sesión.</p><p>Si desea obtener más información sobre los SVG, consulte <a href="https://svg-tutorial.com/">SVG-tutorial.com</a> , donde puede obtener más información sobre los SVG desde niveles principiantes hasta avanzados con muchos ejemplos excelentes.</p><p>Si desea utilizar este comportamiento en un juego, consulta el <a href="https://www.freecodecamp.org/news/gorillas-game-in-javascript/">tutorial del juego Gorillas JavaScript</a> , donde creamos el juego completo desde cero. Es un enorme tutorial de dos horas que cubre el dibujo en un elemento Canvas con JavaScript y toda la lógica del juego con JavaScript simple.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/2q5EufbUEQk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Tutorial de juego JavaScript con HTML Canvas: Gorilas" name="fitvid0" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; position: absolute; top: 0px; left: 0px; width: 720px; height: 404.484px;"></iframe>
          </div>
        </div>
      </figure> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
