Quiero poder detectar cuándo el mouse sale de la ventana para poder evitar que los eventos se activen mientras el mouse del usuario está en otro lugar.
¿Alguna idea de cómo hacer esto?
Quiero poder detectar cuándo el mouse sale de la ventana para poder evitar que los eventos se activen mientras el mouse del usuario está en otro lugar.
¿Alguna idea de cómo hacer esto?
Respuestas:
Este tipo de comportamiento generalmente se desea al implementar el comportamiento de arrastrar y soltar en una página html. La siguiente solución se probó en IE 8.0.6, FireFox 3.6.6, Opera 10.53 y Safari 4 en una máquina con MS Windows XP.
Primero una pequeña función de Peter-Paul Koch; controlador de eventos de navegador cruzado:
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}
Y luego use este método para adjuntar un controlador de eventos al evento mouseout de objetos de documento:
addEvent(document, "mouseout", function(e) {
e = e ? e : window.event;
var from = e.relatedTarget || e.toElement;
if (!from || from.nodeName == "HTML") {
// stop your drag event here
// for now we can just use an alert
alert("left window");
}
});
Finalmente, aquí hay una página html con el script incrustado para la depuración:
<html>
<head>
<script type="text/javascript">
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}
addEvent(window,"load",function(e) {
addEvent(document, "mouseout", function(e) {
e = e ? e : window.event;
var from = e.relatedTarget || e.toElement;
if (!from || from.nodeName == "HTML") {
// stop your drag event here
// for now we can just use an alert
alert("left window");
}
});
});
</script>
</head>
<body></body>
</html>
Si está utilizando jQuery, ¿qué tal este código corto y dulce?
$(document).mouseleave(function () {
console.log('out');
});
Este evento se activará siempre que el mouse no esté en su página como lo desea. Simplemente cambie la función para hacer lo que quiera.
Y también podrías usar:
$(document).mouseenter(function () {
console.log('in');
});
Para disparar cuando el mouse entra de nuevo a la página.
Esto funciona para mi:
addEvent(document, 'mouseout', function(evt) {
if (evt.toElement == null && evt.relatedTarget == null) {
alert("left window");
}
});
addEvent
?
if (!evt.toElement && !evt.relatedTarget)
Para detectar la salida del mouse sin tener en cuenta la barra de desplazamiento y el campo de autocompletar o inspeccionar:
document.addEventListener("mouseleave", function(event){
if(event.clientY <= 0 || event.clientX <= 0 || (event.clientX >= window.innerWidth || event.clientY >= window.innerHeight))
{
console.log("I'm out");
}
});
Explicaciones de condiciones:
event.clientY <= 0 is when the mouse leave from the top
event.clientX <= 0 is when the mouse leave from the left
event.clientX >= window.innerWidth is when the mouse leave from the right
event.clientY >= window.innerHeight is when the mouse leave from the bottom
======================== EDITAR ========================= ======
document.addEventListener ("mouseleave") parece no activarse en la nueva versión de Firefox, mouseleave debe adjuntarse a un elemento como body o un elemento secundario.
Sugiero usar en su lugar
document.body.addEventListener("mouseleave")
O
window.addEventListener("mouseout")
El uso del evento onMouseLeave evita el burbujeo y le permite detectar fácilmente cuando el mouse sale de la ventana del navegador.
<html onmouseleave="alert('You left!')"></html>
document.onmouseleave = function() { alert('You left!') };
No use document.body que dispara barras de desplazamiento que encogen el cuerpo! No se necesita código para prevenir incendios en los elementos. Buena explicación: developer.mozilla.org/en-US/docs/Web/API/Element/…
Ninguna de estas respuestas funcionó para mí. Ahora estoy usando:
document.addEventListener('dragleave', function(e){
var top = e.pageY;
var right = document.body.clientWidth - e.pageX;
var bottom = document.body.clientHeight - e.pageY;
var left = e.pageX;
if(top < 10 || right < 20 || bottom < 10 || left < 10){
console.log('Mouse has moved out of window');
}
});
Estoy usando esto para un widget de carga de archivos de arrastrar y soltar. No es absolutamente exacto, se activa cuando el mouse llega a una cierta distancia del borde de la ventana.
He intentado todo lo anterior, pero nada parece funcionar como se esperaba. Después de investigar un poco, descubrí que e.relatedTarget es el html justo antes de que el mouse salga de la ventana .
Entonces ... terminé con esto:
document.body.addEventListener('mouseout', function(e) {
if (e.relatedTarget === document.querySelector('html')) {
console.log('We\'re OUT !');
}
});
Por favor, avíseme si encuentra algún problema o mejora.
Actualización 2019
(como descubrió el usuario1084282)
document.body.addEventListener('mouseout', function(e) {
if (!e.relatedTarget && !e.toElement) {
console.log('We\'re OUT !');
}
});
relatedTarget
es nulo cuando el mouse sale de la ventana. Inspirado por la respuesta de @ user1084282, cámbielo a esto: if(!e.relatedTarget && !e.toElement) { ... }
y funciona
if(!e.relatedTarget && !e.toElement)
lugar de la condición en la respuesta real. Detecta que el ratón abandona el cuerpo del documento.
Retiro lo que dije. Es posible. Escribí este código, funciona perfectamente.
window.onload = function() {
$span = document.getElementById('text');
window.onmouseout = function() {
$span.innerHTML = "mouse out";
}
window.onmousemove = function() {
$span.innerHTML = "mouse in";
}
}
funciona en chrome, firefox, opera. No se ha probado en IE, pero se supone que funciona.
editar. IE como siempre causa problemas. Para que funcione en IE, reemplace los eventos de la ventana al documento:
window.onload = function() {
$span = document.getElementById('text');
document.onmousemove = function() {
$span.innerHTML = "mouse move";
}
document.onmouseout = function() {
$span.innerHTML = "mouse out";
}
}
combinarlos para la detección del cursor del navegador cruzado o0: P
aplicar este CSS:
html
{
height:100%;
}
Esto asegura que el elemento html ocupa toda la altura de la ventana.
aplicar este jquery:
$("html").mouseleave(function(){
alert('mouse out');
});
El problema con el mouseover y mouseout es que si pasa el mouse sobre / fuera de html a un elemento secundario, se activará el evento. La función que di no se activa al pasar el mouse a un elemento secundario. Solo se activa cuando coloca el mouse fuera / dentro de la ventana
solo para que sepas que puedes hacerlo cuando el usuario pase el mouse por la ventana:
$("html").mouseenter(function(){
alert('mouse enter');
});
Probé uno tras otro y encontré la mejor respuesta en ese momento:
https://stackoverflow.com/a/3187524/985399
Omití los navegadores antiguos, así que reduje el código para que funcione en navegadores modernos (IE9 +)
document.addEventListener("mouseout", function(e) {
let t = e.relatedTarget || e.toElement;
if (!t || t.nodeName == "HTML") {
console.log("left window");
}
});
document.write("<br><br>PROBLEM<br><br><div>Mouseout trigg on HTML elements</div>")
Aquí ves el soporte del navegador
Eso fue bastante corto, pensé
Pero el problema persiste porque "mouseout" se activa en todos los elementos del documento .
Para evitar que suceda, use mouseleave (IE5.5 +). Vea la buena explicación en el enlace.
El siguiente código funciona sin activar elementos dentro del elemento para estar dentro o fuera de. Intente también arrastrar y soltar fuera del documento.
var x = 0
document.addEventListener("mouseleave", function(e) { console.log(x++)
})
document.write("<br><br>SOLUTION<br><br><div>Mouseleave do not trigg on HTML elements</div>")
Puede configurar el evento en cualquier elemento HTML. Sin document.body
embargo, no tenga el evento activado, porque la barra de desplazamiento de Windows puede encoger el cuerpo y dispararse cuando el puntero del mouse está sobre la barra de desplazamiento cuando desea desplazarse pero no desea activar un evento mouseLeave sobre él. Actívelo en su document
lugar, como en el ejemplo.
Tal vez si está escuchando constantemente OnMouseOver en la etiqueta del cuerpo, entonces devuelva la llamada cuando el evento no esté ocurriendo, pero, como dice Zack, esto podría ser muy feo, porque no todos los navegadores manejan los eventos de la misma manera, incluso hay algunos posibilidad de que pierda MouseOver incluso al estar sobre un div en la misma página.
Quizás esto ayude a algunos de los que vendrán aquí más tarde.
window.onblur
y document.mouseout
.
window.onblur
se activa cuando:
Ctrl+Tab
o Cmd+Tab
.Básicamente, cada vez que la pestaña del navegador pierde el foco.
window.onblur = function(){
console.log("Focus Out!")
}
document.mouseout
se activa cuando:
Ctrl+Tab
o Cmd+Tab
.Básicamente, en cualquier caso, cuando el cursor abandona el documento.
document.onmouseleave = function(){
console.log("Mouse Out!")
}
window.onblur
también. +1
$(window).mouseleave(function() {
alert('mouse leave');
});
Esto funcionó para mí. Una combinación de algunas de las respuestas aquí. E incluí el código que muestra un modelo solo una vez. Y el modelo desaparece cuando se hace clic en cualquier otro lugar.
<script>
var leave = 0
//show modal when mouse off of page
$("html").mouseleave(function() {
//check for first time
if (leave < 1) {
modal.style.display = "block";
leave = leave + 1;
}
});
// Get the modal with id="id01"
var modal = document.getElementById('id01');
// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = "none";
}
}
</script>
var demo = document.getElementById('demo');
document.addEventListener("mouseout", function(e){demo.innerHTML="😞";});
document.addEventListener("mouseover", function(e){demo.innerHTML="😊";});
div { font-size:80vmin; position:absolute;
left:50%; top:50%; transform:translate(-50%,-50%); }
<div id='demo'>😐</div>