¿Conoces esas molestas ventanas emergentes que aparecen cuando intentas cerrar una ventana del navegador?
De alguna manera saben que estás intentando cerrarlo, como si pudieras leer tu mente.
En realidad es un concepto bastante simple: tienes que escuchar un evento DOM específico.
Ciertamente no recomiendo el uso de popups, porque los encuentros molestos, pero es posible que tu empresa te pida implementar uno, así que aquí estamos.
Me gusta mantener las cosas simples, así que aquí está el HTML.
!doctype htmlhead titlePopup page/title/headbody div h3Popup!/h3 /div/body
Añade este CSS:
body { font-family: system-ui; background-color: #f6d198;}#popup { position: fixed; width: 100%; visibility: hidden; z-index: 10002; top: 0; opacity: 0; transform: scale(0.5); transition: transform 0.2s, opacity 0.2s, visibility 0s 0.2s; position: relative; margin: 0 auto; text-align: center; box-shadow: 0 1px 10px rgba(0, 0, 0, 0.5); width: 60%; background: #862a5c; padding-bottom: 100px; padding-top: 50px; color: #fff; font-size: 2rem;}
y este JavaScript:
const show = () = { const element = document.querySelector("#popup") element.style.visibility = "visible" element.style.opacity = "1" element.style.transform = "scale(1)" element.style.transition = "0.4s, opacity 0.4s"}document.addEventListener("DOMContentLoaded", () = { document.addEventListener("mouseout", (event) = { if (!event.toElement !event.relatedTarget) { setTimeout(() = { show() }, 1000) } })})
Véalo en Codepen: https://codepen.io/flaviocopes/pen/gOawyKr
La página debería parecer bastante aburrida:
Si intenta cargar y entrar o salir de la página con el mouse, debería aparecer una ventana emergente:
Esto se debe al hecho de que escuchamos el mouseout
evento y queremos 1 segundo antes de mostrar la ventana emergente.
Una vez que tengas los conceptos básicos, puedes comenzar a agregar cosas sofisticadas como cerrar la ventana emergente si el usuario presiona la esc
tecla:
const hide = () = { const element = document.querySelector("#popup") element.style.visibility = "hidden" element.style.opacity = "0" element.style.transform = "scale(0.5)" element.style.transition = "0.2s, opacity 0.2s, visibility 0s 0.2s"}document.addEventListener("DOMContentLoaded", () = { document.onkeydown = event = { event = event || window.event if (event.keyCode === 27) { hide() } }})
y si el usuario hace clic en el documento fuera del modal:
let eventListener//inside show()eventListener = document.addEventListener("click", function (clickEvent) { let el = clickEvent.target let inPopup = false if (el.id === 'popup') { inPopup = true } while (el = el.parentNode) { if (el.id == "popup") { inPopup = true } } if (!inPopup) hide()})//inside hide()if (eventListener) { document.removeEventListener(eventListener)}
Ejemplo en Codepen: https://codepen.io/flaviocopes/pen/abvmrzg
Ahora, algo interesante que podemos hacer es almacenar el hecho de que mostramos el modal en una cookie, de modo que solo lo mostramos una vez a cada persona.
Esta es una posible implementación: configuramos la popup=true
cookie cuando mostramos el modal y verificamos la cookie antes de mostrarlo nuevamente:
let showed = false;const show = () = { if (showed) return; if ( document.cookie.split(";").filter((item) = { return item.includes("popup="); }).length ) { return; } else { console.log( document.cookie.split(";").filter((item) = { return item.includes("popup=") }).length ) console.log(document.cookie.split(";")) } document.cookie = "popup=true;path=/;max-age=15768000" showed = true //...the remaining part of show()
Tips para principiantes de JavaScript
Tal vez te puede interesar:
- Introducción a React
- Agregar evento de clic a los elementos DOM devueltos desde querySelectorAll
- Cómo cambiar el valor de un nodo DOM
- Cómo comprobar si un elemento DOM tiene una clase
Cómo crear una ventana emergente de intención de salida
¿Conoces esas molestas ventanas emergentes que aparecen cuando intentas cerrar una ventana del navegador?
programar
es
2025-01-06
Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente