Je veux pouvoir détecter le moment où la souris quitte la fenêtre afin que je puisse arrêter le déclenchement des événements alors que la souris de l'utilisateur est ailleurs.
Des idées sur la façon de procéder?
Je veux pouvoir détecter le moment où la souris quitte la fenêtre afin que je puisse arrêter le déclenchement des événements alors que la souris de l'utilisateur est ailleurs.
Des idées sur la façon de procéder?
Réponses:
Ce type de comportement est généralement souhaité lors de l'implémentation du comportement glisser-déposer sur une page html. La solution ci-dessous a été testée sur IE 8.0.6, FireFox 3.6.6, Opera 10.53 et Safari 4 sur une machine MS Windows XP.
D'abord une petite fonction de Peter-Paul Koch; gestionnaire d'événements cross browser:
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}
Et puis utilisez cette méthode pour attacher un gestionnaire d'événements à l'événement mouseout des objets de document:
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");
}
});
Enfin, voici une page html avec le script intégré pour le débogage:
<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 vous utilisez jQuery, que diriez-vous de ce code court et doux -
$(document).mouseleave(function () {
console.log('out');
});
Cet événement se déclenchera chaque fois que la souris n'est pas dans votre page comme vous le souhaitez. Changez simplement la fonction pour faire ce que vous voulez.
Et vous pouvez également utiliser:
$(document).mouseenter(function () {
console.log('in');
});
À déclencher lorsque la souris revient à la page.
Cela fonctionne pour moi:
addEvent(document, 'mouseout', function(evt) {
if (evt.toElement == null && evt.relatedTarget == null) {
alert("left window");
}
});
addEvent
?
if (!evt.toElement && !evt.relatedTarget)
Afin de détecter la sortie de la souris sans prendre en compte la barre de défilement et le champ autcomplete ou inspecter:
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");
}
});
Explications des conditions:
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
========================= EDIT ========================== ======
document.addEventListener ("mouseleave") ne semble pas être déclenché sur la nouvelle version de Firefox, mouseleave doit être attaché à un élément comme body, ou à un élément enfant.
Je suggère d'utiliser à la place
document.body.addEventListener("mouseleave")
Ou
window.addEventListener("mouseout")
L'utilisation de l'événement onMouseLeave empêche la formation de bulles et vous permet de détecter facilement le moment où la souris quitte la fenêtre du navigateur.
<html onmouseleave="alert('You left!')"></html>
document.onmouseleave = function() { alert('You left!') };
utilisez not document.body qui déclenche des barres de défilement qui rétrécissent le corps! Le code pour empêcher le feu sur les éléments n'est pas nécessaire. Bonne explication: developer.mozilla.org/en-US/docs/Web/API/Element/…
Aucune de ces réponses n'a fonctionné pour moi. J'utilise maintenant:
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');
}
});
J'utilise ceci pour un widget de téléchargement de fichiers par glisser-déposer. Ce n'est pas absolument précis, étant déclenché lorsque la souris arrive à une certaine distance du bord de la fenêtre.
J'ai essayé tout ce qui précède, mais rien ne semble fonctionner comme prévu. Après quelques recherches, j'ai trouvé que e.relatedTarget est le code HTML juste avant que la souris ne quitte la fenêtre .
Alors ... j'ai fini avec ceci:
document.body.addEventListener('mouseout', function(e) {
if (e.relatedTarget === document.querySelector('html')) {
console.log('We\'re OUT !');
}
});
Faites-moi savoir si vous trouvez des problèmes ou des améliorations!
Mise à jour 2019
(comme user1084282 l'a découvert)
document.body.addEventListener('mouseout', function(e) {
if (!e.relatedTarget && !e.toElement) {
console.log('We\'re OUT !');
}
});
relatedTarget
est nul lorsque la souris quitte la fenêtre. Inspiré par la réponse de @ user1084282, changez-le en ceci: if(!e.relatedTarget && !e.toElement) { ... }
et ça marche
if(!e.relatedTarget && !e.toElement)
place de la condition dans la réponse réelle. Il détecte que la souris quitte le corps du document.
Je reprends ce que j'ai dit. C'est possible. J'ai écrit ce code, fonctionne parfaitement.
window.onload = function() {
$span = document.getElementById('text');
window.onmouseout = function() {
$span.innerHTML = "mouse out";
}
window.onmousemove = function() {
$span.innerHTML = "mouse in";
}
}
fonctionne dans chrome, firefox, opéra. Aint testé dans IE mais suppose que cela fonctionne.
Éditer. IE comme toujours cause des problèmes. Pour le faire fonctionner dans IE, remplacez les événements d'une fenêtre à l'autre:
window.onload = function() {
$span = document.getElementById('text');
document.onmousemove = function() {
$span.innerHTML = "mouse move";
}
document.onmouseout = function() {
$span.innerHTML = "mouse out";
}
}
combinez-les pour la détection de curseur crossbrowser kick ass o0: P
appliquez ce css:
html
{
height:100%;
}
Cela garantit que l'élément html occupe toute la hauteur de la fenêtre.
appliquez cette jquery:
$("html").mouseleave(function(){
alert('mouse out');
});
Le problème avec mouseover et mouseout est que si vous survolez / sortez du html vers un élément enfant, cela déclenchera l'événement. La fonction que j'ai donnée n'est pas activée lorsque vous passez la souris sur un élément enfant. Il ne se déclenche que lorsque vous sortez / rentrez la souris de la fenêtre
juste pour que vous sachiez que vous pouvez le faire lorsque l'utilisateur souris dans la fenêtre:
$("html").mouseenter(function(){
alert('mouse enter');
});
J'ai essayé les uns après les autres et j'ai trouvé la meilleure réponse à l'époque:
https://stackoverflow.com/a/3187524/985399
J'ai ignoré les anciens navigateurs, j'ai donc raccourci le code pour qu'il fonctionne sur les navigateurs modernes (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>")
Ici vous voyez le support du navigateur
C'était assez court je pensais
Mais un problème subsistait car "mouseout" se déclenchait sur tous les éléments du document .
Pour éviter que cela ne se produise, utilisez mouseleave (IE5.5 +). Voir la bonne explication dans le lien.
Le code suivant fonctionne sans déclencher sur les éléments à l'intérieur de l'élément à l'intérieur ou à l'extérieur de. Essayez également de glisser-relâcher en dehors du document.
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>")
Vous pouvez définir l'événement sur n'importe quel élément HTML. N'activez pas l'événement document.body
, car la barre de défilement de Windows peut réduire le corps et se déclencher lorsque le pointeur de la souris est au-dessus de la barre de défilement lorsque vous souhaitez faire défiler mais pas déclencher un événement mouseLeave dessus. Activez-le à la document
place, comme dans l'exemple.
Peut-être que si vous écoutez constamment OnMouseOver dans la balise body, puis rappelez-vous lorsque l'événement ne se produit pas, mais, comme Zack le déclare, cela pourrait être très moche, car tous les navigateurs ne gèrent pas les événements de la même manière, il y en a même certains. possibilité que vous perdiez le MouseOver même en étant sur un div dans la même page.
Peut-être que cela aiderait certains de ceux qui viennent ici plus tard.
window.onblur
et document.mouseout
.
window.onblur
est déclenché lorsque:
Ctrl+Tab
ou Cmd+Tab
.Fondamentalement, chaque fois que l'onglet du navigateur perd le focus.
window.onblur = function(){
console.log("Focus Out!")
}
document.mouseout
est déclenché lorsque:
Ctrl+Tab
ou Cmd+Tab
.En gros dans tous les cas lorsque votre curseur quitte le document.
document.onmouseleave = function(){
console.log("Mouse Out!")
}
window.onblur
aussi. +1
$(window).mouseleave(function() {
alert('mouse leave');
});
Cela a fonctionné pour moi. Une combinaison de certaines des réponses ici. Et j'ai inclus le code montrant un modèle une seule fois. Et le modèle disparaît lorsque vous cliquez ailleurs.
<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>