Bienvenido a la Comunidad de Treehouse

¿Quieres colaborar en errores de código? ¿Tienes errores que necesitan comentarios? ¿Buscas un par de ojos adicionales en tu último proyecto? aquí.

¿Buscas aprender algo nuevo?

Treehouse ofrece una prueba gratuita de siete días para estudiantes nuevos. Obtén acceso a miles de horas de contenido y únete a miles de

Inicia tu prueba gratuita

JavaScript Una solución

Andrew Whatmore
sello-máscara
.a{fill-rule:evenodd;}techdegree
Andrew Whatmore
JavaScript Full Stack Estudiante de Techdegree 11,380 Puntos

Solución - navegación con ratón así como con tabulación

Agregar navegación con ratón y tabulación.

He intentado agregar una solución que se enfoca en clics del ratón así como navegación por tabulación.

¿Es esta la forma más eficiente de hacerlo? No se me ocurrió una forma de combinar el código en absoluto, ya que usé propagación para la navegación del ratón para ahorrar memoria, mientras que la navegación por tabulación usa un detector de eventos para cada casilla de verificación.

Muchas gracias de antemano

// Seleccionar las casillas de verificación
const casillas de verificación = documento.querySelectorAll('input[type="checkbox"]');

// Seleccionar el conjunto de campos que contiene las entradas de casilla de verificación
const checkboxSet = documento.querySelector('fieldset.heroes');

// PARA NAVEGACIÓN CON RATÓN
// Crear una variable para almacenar la casilla de verificación actual
let currentCheckbox;
// escuchar un evento de enfoque dentro del conjunto de campos
checkboxSet.addEventListener('click', (e) => {
  // si el elemento en el que se hizo clic fue una casilla de verificación
  if (e.target.type === checkbox) {
    // borrar casilla de verificación anterior
    if (currentCheckbox) {
      // eliminar la clase de enfoque
      currentCheckbox.classList.remove('focus');
      // También eliminar la clase 'focus' del elemento de etiqueta principal
      currentCheckbox.parentElement.classList.remove('focus');
    }
    // establecer currentCheckbox en el elemento en el que se hizo clic        
    currentCheckbox = e.target;
    // agregar la clase 'focus' a la casilla de verificación
    currentCheckbox.classList.add('focus');
    // agregar la clase 'focus' al elemento de etiqueta principal
    currentCheckbox.parentElement.classList.add('focus');
  }
});

// PARA NAVEGACIÓN POR TABULACIÓN
// Recorrer cada casilla de verificación
casillas de verificación.forEach(checkbox => {
// Paso 3: Agregar un detector de eventos para el evento 'focus' a cada casilla de verificación
  checkbox.addEventListener('focus', () => {
  // Paso 3.1: Cuando una casilla de verificación obtiene el enfoque, agregar la clase 'focus' a la casilla de verificación
    checkbox.classList.add('focus');
  // Paso 3.2: También agregar la clase 'focus' al elemento de etiqueta principal
    checkbox.parentElement.classList.add('focus');
  });

// Paso 4: Agregar un detector de eventos para el evento 'blur' a cada casilla de verificación
  checkbox.addEventListener('blur', () => {
  // Paso 4.1: Cuando una casilla de verificación pierde el enfoque, eliminar la clase 'focus'
    checkbox.classList.remove('focus');
  // Paso 4.2: También eliminar la clase 'focus' del elemento de etiqueta principal
    checkbox.parentElement.classList.remove('focus');
  });
});

1 Respuesta

Brian Jensen
sello-máscara
PERSONAL
.a{fill-rule:evenodd;}techdegree
Brian Jensen
Profesor de Treehouse

Esa es una solución increíble Andrew Whatmore! :fire: ¡Me encanta que hayas ido más allá y también hayas agregado activación por ratón!

Tu código es muy eficiente dentro del alcance de focus y blur, ya que estos eventos no admiten propagación de eventos completa. Hay eventos más nuevos que sí admiten propagación completa, pero actualmente no se enseñan porque aún no tienen compatibilidad total con navegadores. Estos eventos son focusin y focusout, que se pueden adjuntar directamente al elemento del formulario. De esta manera, cualquier método para activar el enfoque en una casilla de verificación activará el evento.