Saltar al contenido principal
Codigo Heroe
Tarea anterior
Introducción a los eventos5/21
A la lista de tareas
  1. 1. Eventos del usuario
  2. 2. Añadir un manejador de eventos
  3. 3. Sintaxis de los manejadores
  4. 4. Acciones predeterminadas
  5. 5. Funciones como argumentos
  6. 6. Eliminar clases con classList.remove()
  7. 7. Eventos de teclado
  8. 8. Identificar una tecla
  9. 9. Cerrar una ventana con ESC
  10. 10. Seleccionar los elementos de una galería
  11. 11. Añadir manejadores en un ciclo
  12. 12. Cambiar el src de una imagen
  13. 13. Depurar un manejador
  14. 14. Ámbito local
  15. 15. Ámbito global
  16. 16. Cambiar variables externas
  17. 17. Funciones dentro de funciones
  18. 18. Cierres
  19. 19. Un cierre en cada llamada
  20. 20. Usar cierres en los manejadores
  21. 21. Completar la galería
Siguiente tarea
  • Matriz de skills
  • Cursos
  • Registro
  • Iniciar sesión

Loading…
En unos segundos, estará listo.

  • Teoría
  • Teoría

Funciones como argumentos

Ahora el enlace ya no abre otra página. Podemos sustituir el mensaje en la consola por una instrucción que añada la clase modal--show al elemento guardado en popup.

Ya vimos la sintaxis de los manejadores y el objeto del evento, pero queda algo por explicar. Quizá te haya parecido inusual la forma de añadir el manejador.

button.addEventListener('click', function () {
  // Instrucciones
});

Pasamos una función como argumento de otra: addEventListener. Puede parecer extraño, pero es una práctica habitual en JavaScript. ¡Además, ya pasaste funciones a otras funciones antes!

var getString = function () {
  return '¡Hola desde la función!';
}

console.log(getString);    // Muestra el código de la función
console.log(getString()); // Muestra: ¡Hola desde la función!

Pasamos a console.log tanto una función como el resultado de llamarla. ¡Y console.log() también es una función!

Con el manejador hacemos lo mismo, pero sin guardar la función en una variable.

console.log(function () {
  return '¡Hola desde la función!';
});
// Muestra el código de la función

console.log(function () {
  return '¡Hola desde la función!';
}());
// Muestra: ¡Hola desde la función!

Esta función no tiene nombre ni está guardada en una variable: la creamos en el mismo lugar donde la pasamos a otra función. Las funciones sin nombre como estas se llaman funciones anónimas.

Fíjate en lo esencial: pasamos la función a addEventListener, sin llamarla. Si la llamamos ahí, sus instrucciones se ejecutarán de inmediato y no quedará registrada como manejador para el momento que necesitamos. Es un error frecuente.

// Esta forma de añadir un manejador es incorrecta

button.addEventListener('click', function () {
  console.log('Clic en el botón');
}());
// El mensaje Clic en el botón aparece de inmediato en la consola

Normalmente JavaScript ejecuta las instrucciones de un programa una tras otra. Al registrar un manejador de clic, sus instrucciones no se ejecutan de inmediato: quedan a la espera de una acción del usuario. Puede hacer clic cinco o diez minutos después de abrir el sitio, o no hacerlo nunca. Esta espera permite reaccionar a acciones posteriores sin detener el resto del programa: es un ejemplo de comportamiento asíncrono.

Completemos el código para que la ventana aparezca al hacer clic en «Mostrar contacto».

  • index.html
  • style.css
  • script.js
HTML
<!DOCTYPE html> <html lang="es"> <head> <meta charset="utf-8"> <title>CandyShop</title> <link href="candy-shop/setting.css" rel="stylesheet"> <link href="style.css" rel="stylesheet"> </head> <body> <section class="card"> <div class="card__content"> <h1 class="visually-hidden">Heladería CandyShop</h1> <img class="card__logo" src="candy-shop/candyshop.svg" width="205" height="63" alt="CandyShop"> <p class="card__text">¡Preparamos helado con la crema más fresca!</p> <img class="card__img" src="candy-shop/icecream.png" width="196" height="240" alt="Helado"> </div> <div class="card__controls"> <a href="contacts.html" class="card__button button-open">Mostrar contacto</a> </div> </section> <section class="modal"> <div class="modal__content"> <h2 class="visually-hidden">Contacto</h2> <h3>Dirección:</h3> <p>Calle de la Crema, 19, Ciudad Dulce</p> <h3>Teléfono:</h3> <p>+1 (555) 010-1919</p> <h3>Correo:</h3> <p>contacto@example.com</p> <button class="modal__button button-close" type="button">Cerrar</button> </div> </section> <script src="script.js"></script> </body> </html>
CSS
h3 { margin: 0.5em 0; } p { margin: 0.5em 0 2em; } .card { width: 420px; margin: 50px auto 0; } .card__content { position: relative; background-color: #fad400; display: flex; flex-direction: column; align-items: flex-start; padding-top: 15px; padding-left: 20px; box-shadow: 0 5px 8px 0 #e8e8e8; } .card__img { align-self: flex-end; margin-top: auto; } .card__logo { position: absolute; } .card__text { font-size: 16px; line-height: 22px; font-weight: bold; position: absolute; left: 20px; top: 100px; width: 190px; } .card__controls { display: flex; justify-content: center; align-items: center; border: 2px solid #e8e8e8; border-top: 0; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; padding-top: 20px; padding-bottom: 20px; } .card__button { border: 0; padding: 12px 0; width: 230px; text-transform: uppercase; text-align: center; border-radius: 50px; color: #ffffff; font-weight: bold; font-size: 16px; text-decoration: none; background-color: #fad400; } .card__button:hover, .card__button:focus { background-color: #82da03; } .card__button:active { color: rgba(255, 255, 255, 0.3); background-color: #6cb502; } .modal { display: none; position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .modal--show { display: block; } .modal::after { content: ""; position: fixed; top: 0; left: 0; height: 100%; width: 100%; background-color: rgba(0, 0, 0, 0.3); z-index: 1; } .modal__content { position: relative; width: 300px; margin: 100px auto; padding: 30px 70px 15px; background-color: #ffffff; box-shadow: -1px 5px 12px 0 rgba(89, 90, 90, 0.3); z-index: 2; } .modal__button { position: absolute; top: 20px; right: 20px; width: 20px; height: 20px; font-size: 0; background: none; border: 0; } .modal__button::after, .modal__button::before { content: ""; position: absolute; right: 0; top: 20px; width: 26px; height: 6px; margin: -13px -3px; background-color: #7656de; } .modal__button::before { transform: rotate(45deg); } .modal__button::after { transform: rotate(-45deg); } .modal__button:hover::after, .modal__button:hover::before, .modal__button:focus::after, .modal__button:focus::before { background-color: #9b7ff7; } .modal__button:active::after, .modal__button:active::before { background-color: #4023a0; } .visually-hidden { position: absolute; width: 1px; height: 1px; margin: -1px; border: 0; padding: 0; white-space: nowrap; clip-path: inset(100%); clip: rect(0 0 0 0); overflow: hidden; }
JavaScript
var popup = document.querySelector('.modal'); var openPopupButton = document.querySelector('.button-open'); openPopupButton.addEventListener('click', function (evt) { evt.preventDefault(); console.log('Clic en el botón'); });

El código ha cambiado, haz clic en "Actualizar" o activa la ejecución automática.

Ha ido a otra página

Haga clic dentro del mininavegador para poner el foco en esta ventana.

100%
Consola
ObjetivosRealizado
0
    1. En la función manejadora, elimina el mensaje en la consola. En su lugar, usa classList.add() para añadir la clase modal--show a popup.
    2. Haz clic en el botón «Mostrar contacto» y comprueba que la ventana aparece en la página.
    Codigo Heroe

    © 2023-2026, codigoheroe.com