El Atributo ONPAGEHIDE

El atributo onpagehide se dispara cuando el usuario abandona la página.
El atributo onpagehide se dispara cuando el usuario abandona la página, ya sea por:
-
Navegar a otra página
-
Cerrar la pestaña/ventana
-
Actualizar la página
-
Usar el botón "Atrás/Adelante"
Es parte de la Page Visibility API y complementa otros eventos como onunload y onbeforeunload.
Sintaxis Básica
HTML:
<body onpagehide="miFuncion(event)">
JavaScript:
window.addEventListener('pagehide', (event) => {
// Lógica aquí
});
Ejemplos Clave
Ejemplo 1: Autoguardado de Progreso
JavaScript:
function manejarSalidaPagina() {
localStorage.setItem('autoSaveContent', editor.value);
}
Ejemplo 2: Análisis de Tiempo en Página
JavaScript:
let startTime = Date.now();
function manejarSalidaPagina() {
const tiempoSesion = Date.now() - startTime;
enviarMetricasAlServidor(tiempoSesion);
}
Ejemplo 3: Control de Cambios no Guardados
JavaScript:
if(unsavedChanges) {
event.preventDefault();
mostrarConfirmacion();
}
Propiedades Importantes
event.persisted: Indica si la página está en caché (útil para navegación con bfcache)
JavaScript:
if(event.persisted) {
// La página está siendo almacenada en caché
}
Diferencias con Eventos Similares
| Evento | Momento de Activación | ¿Se puede cancelar? |
|---|---|---|
onpagehide |
Cuando la página comienza a ocultarse | Sí (con limitaciones) |
onbeforeunload |
Antes de descargar la página | Sí |
onunload |
Cuando la página se está descargando | No |
Buenas Prácticas
Optimiza el rendimiento:
JavaScript:
event.preventDefault(); // Usar solo cuando sea necesario
Manejo asíncrono:
JavaScript:
event.waitUntil(
new Promise((resolve) => {
// Operaciones asíncronas
resolve();
})
);
Limpia recursos:
JavaScript:
clearInterval(intervalID); websocket.close();
Prueba con bfcache:
JavaScript:
window.addEventListener('pageshow', (event) => {
if(event.persisted) {
// La página fue restaurada desde el caché
}
});
Casos de Uso Avanzados
-
Recuperación de sesión: Guardar estado de aplicaciones complejas
-
Optimización de rendimiento: Liberar memoria antes de salir
-
Análisis de usuario: Registrar patrones de navegación
-
Sincronización final: Enviar última versión de datos al servidor
Compatibilidad
| Navegador | Soporte |
|---|---|
| Chrome | ✅ 24+ |
| Firefox | ✅ 10+ |
| Safari | ✅ 7+ |
| Edge | ✅ 17+ |
Conclusión
El atributo onpagehide es esencial para:
-
Mejorar la persistencia de datos
-
Optimizar el rendimiento
-
Proporcionar retroalimentación al usuario
-
Recopilar métricas importantes
Implementa siempre:
-
Manejo de operaciones asíncronas
-
Limpieza adecuada de recursos
- Comprobación del estado
persisted
JavaScript:
<!-- Ejemplo Final: Gestión de Recursos -->
<script>
let recursos = [];
function cargarRecurso(url) {
const recurso = new HeavyResource(url);
recursos.push(recurso);
}
window.addEventListener('pagehide', () => {
recursos.forEach(recurso => recurso.liberar());
recursos = [];
});
</script>
Este tutorial te proporciona las bases para manejar eficientemente la salida de usuarios en tus aplicaciones web. ¡Experimenta y crea experiencias más robustas!
HTML:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Tutorial: Uso del atributo "onpagehide"</title>
<style>
.session-box {
border: 2px solid #3498db;
padding: 20px;
margin: 20px;
border-radius: 8px;
}
#activityLog {
height: 150px;
overflow-y: auto;
padding: 10px;
background-color: #f8f9fa;
border: 1px solid #ddd;
}
.warning {
color: #e74c3c;
font-weight: bold;
}
</style>
</head>
<body onpagehide="manejarSalidaPagina(event)">
<h1>Tutorial del atributo <code>onpagehide</code></h1>
<!-- Ejemplo 1: Guardar progreso -->
<div class="session-box">
<h2>1. Guardado automático de progreso</h2>
<textarea id="editor" placeholder="Escribe aquí..." rows="5"></textarea>
<p>Último guardado: <span id="lastSave">Nunca</span></p>
</div>
<!-- Ejemplo 2: Registro de actividad -->
<div class="session-box">
<h2>2. Registro de tiempo en página</h2>
<div id="activityLog"></div>
<p>Tiempo activo: <span id="activeTime">0</span> segundos</p>
</div>
<!-- Ejemplo 3: Advertencia de cambios no guardados -->
<div class="session-box">
<h2>3. Control de cambios no guardados</h2>
<form id="mainForm">
<input type="text" placeholder="Nombre" id="nombre">
<button type="button" onclick="guardarCambios()">Guardar</button>
</form>
<p id="unsavedWarning" class="warning" style="display: none;">
¡Tienes cambios no guardados!
</p>
</div>
<script>
// Variables de estado
let startTime = Date.now();
let unsavedChanges = false;
let autoSaveInterval;
// Ejemplo 1: Sistema de autoguardado
const editor = document.getElementById('editor');
const lastSaveElement = document.getElementById('lastSave');
function guardarProgreso() {
localStorage.setItem('autoSaveContent', editor.value);
lastSaveElement.textContent = new Date().toLocaleTimeString();
}
// Ejemplo 2: Registro de tiempo
function actualizarTiempoActivo() {
const elapsed = Math.floor((Date.now() - startTime) / 1000);
document.getElementById('activeTime').textContent = elapsed;
}
// Ejemplo 3: Control de cambios
document.getElementById('mainForm').addEventListener('input', () => {
unsavedChanges = true;
document.getElementById('unsavedWarning').style.display = 'block';
});
function guardarCambios() {
unsavedChanges = false;
document.getElementById('unsavedWarning').style.display = 'none';
}
// Manejador principal de pagehide
function manejarSalidaPagina(event) {
// Ejemplo 1: Guardar contenido automáticamente
guardarProgreso();
// Ejemplo 2: Registrar tiempo final
const tiempoFinal = Math.floor((Date.now() - startTime) / 1000);
logActividad(`Sesión finalizada - Duración: ${tiempoFinal}s`);
// Ejemplo 3: Advertencia de cambios no guardados
if(unsavedChanges && !event.persisted) {
event.preventDefault();
const confirmacion = confirm('¡Tienes cambios no guardados! ¿Seguro que quieres salir?');
if(!confirmacion) return;
}
// Limpiar recursos
clearInterval(autoSaveInterval);
}
// Función auxiliar para registro de actividad
function logActividad(mensaje) {
const log = document.getElementById('activityLog');
log.innerHTML += `<div>${new Date().toLocaleTimeString()}: ${mensaje}</div>`;
log.scrollTop = log.scrollHeight;
}
// Inicialización
window.addEventListener('load', () => {
// Cargar contenido guardado
if(localStorage.getItem('autoSaveContent')) {
editor.value = localStorage.getItem('autoSaveContent');
}
// Configurar intervalos
autoSaveInterval = setInterval(guardarProgreso, 10000);
setInterval(actualizarTiempoActivo, 1000);
logActividad('Sesión iniciada');
});
// Manejar eventos de visibilidad
document.addEventListener('visibilitychange', () => {
if(document.visibilityState === 'hidden') {
logActividad('Página oculta');
} else {
logActividad('Página visible');
}
});
</script>
</body>
</html>