Saltar al contenido principal
Codigo Heroe
Tarea anterior
Introducción a los eventos4/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

Acciones predeterminadas

El manejador de clic se ejecutó y apareció el mensaje, pero también se abrió otra página.

El botón está maquetado como un enlace, con la etiqueta <a>, en lugar de <button>, por si los scripts no funcionan para el usuario. Es poco frecuente, pero quien maquetó la página contempló esa posibilidad. No podemos cambiar el HTML: nuestra tarea es programar la lógica. En la práctica ocurre a menudo: recibimos una página ya maquetada y debemos resolver la tarea sin cambiar su estructura.

¿Qué podemos hacer?

Algunos elementos tienen acciones predeterminadas. Por ejemplo, hacer clic en el botón de envío de un formulario envía sus datos al servidor, y hacer clic en un enlace lleva al navegador a su destino. ¡Ese es nuestro caso!

Podemos cancelar las acciones predeterminadas cuando sea necesario. Para hacerlo utilizaremos el objeto del evento.

El navegador pasa el objeto del evento a la función manejadora cuando ocurre el evento. Este objeto tiene muchas propiedades y métodos útiles. Uno de ellos cancela la acción predeterminada: preventDefault().

Para usar sus propiedades y métodos, basta con declarar un parámetro en la función manejadora y escribir las instrucciones. JavaScript se encarga del resto. Algunas personas llaman a ese parámetro event y otras prefieren abreviarlo como evt. Nosotros usaremos evt. El objeto del evento se recibirá en ese parámetro cuando el evento ocurra.

link.addEventListener('click', function(evt) {
  // Cancelamos la acción predeterminada
  evt.preventDefault();

  // Añadimos las instrucciones para el clic
  console.log('Ocurrió un clic');
});

En el ejemplo cancelamos la acción predeterminada: al hacer clic en el enlace, no se abrirá su destino. En cambio, aparecerá el mensaje Ocurrió un clic en la consola.

Cancelemos la acción predeterminada del enlace «Mostrar contacto» de nuestro proyecto y comprobemos que ya no abre otra página. Así conservamos el comportamiento previsto: con los scripts activos, aparecerá la ventana emergente; sin ellos, el enlace llevará a una página de contacto preparada de antemano.

  • 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 () { 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. Añade el parámetro evt a la función manejadora.
    2. Dentro del manejador, antes del mensaje en la consola, cancela la acción predeterminada del enlace con evt.preventDefault().
    3. Haz clic en el botón «Mostrar contacto».
    Codigo Heroe

    © 2023-2026, codigoheroe.com