Ich möchte erkennen können, wann die Maus das Fenster verlässt, damit ich verhindern kann, dass Ereignisse ausgelöst werden, während sich die Maus des Benutzers an einer anderen Stelle befindet.
Irgendwelche Ideen, wie das geht?
Ich möchte erkennen können, wann die Maus das Fenster verlässt, damit ich verhindern kann, dass Ereignisse ausgelöst werden, während sich die Maus des Benutzers an einer anderen Stelle befindet.
Irgendwelche Ideen, wie das geht?
Antworten:
Diese Art von Verhalten ist normalerweise erwünscht, wenn Drag-Drop-Verhalten auf einer HTML-Seite implementiert wird. Die folgende Lösung wurde unter IE 8.0.6, FireFox 3.6.6, Opera 10.53 und Safari 4 auf einem MS Windows XP-Computer getestet.
Zuerst eine kleine Funktion von Peter-Paul Koch; Browserübergreifender Ereignishandler:
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}
Verwenden Sie dann diese Methode, um einen Ereignishandler an das Mouseout-Ereignis für Dokumentobjekte anzuhängen:
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");
}
});
Schließlich ist hier eine HTML-Seite mit dem Skript zum Debuggen eingebettet:
<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>
Wenn Sie jQuery verwenden, wie wäre es dann mit diesem kurzen und süßen Code -
$(document).mouseleave(function () {
console.log('out');
});
Dieses Ereignis wird immer dann ausgelöst, wenn sich die Maus nicht wie gewünscht auf Ihrer Seite befindet. Ändern Sie einfach die Funktion, um zu tun, was Sie wollen.
Und Sie könnten auch verwenden:
$(document).mouseenter(function () {
console.log('in');
});
Auslösen, wenn die Maus wieder zur Seite zurückkehrt.
Das funktioniert bei mir:
addEvent(document, 'mouseout', function(evt) {
if (evt.toElement == null && evt.relatedTarget == null) {
alert("left window");
}
});
addEvent
?
if (!evt.toElement && !evt.relatedTarget)
Um Mausblätter zu erkennen, ohne die Bildlaufleiste und das Feld für die automatische Vervollständigung zu berücksichtigen, oder um Folgendes zu überprüfen:
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");
}
});
Bedingungen Erklärungen:
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
======================= BEARBEITEN ========================== ======
document.addEventListener ("mouseleave") scheint bei einer neuen Firefox-Version nicht ausgelöst zu werden. Mouseleave muss an ein Element wie body oder ein untergeordnetes Element angehängt werden.
Ich schlage vor, stattdessen zu verwenden
document.body.addEventListener("mouseleave")
Oder
window.addEventListener("mouseout")
Die Verwendung des Ereignisses onMouseLeave verhindert das Sprudeln und ermöglicht es Ihnen, leicht zu erkennen, wann die Maus das Browserfenster verlässt.
<html onmouseleave="alert('You left!')"></html>
document.onmouseleave = function() { alert('You left!') };
Verwenden Sie nicht document.body, das über Bildlaufleisten ausgelöst wird, die den Körper verkleinern! Code zur Verhinderung eines Brandes auf Elementen wird nicht benötigt. Gute Erklärung: developer.mozilla.org/en-US/docs/Web/API/Element/…
Keine dieser Antworten hat bei mir funktioniert. Ich benutze jetzt:
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');
}
});
Ich verwende dies für ein Widget zum Hochladen von Dateien per Drag & Drop. Es ist nicht absolut genau und wird ausgelöst, wenn die Maus einen bestimmten Abstand vom Fensterrand erreicht.
Ich habe alles oben versucht, aber nichts scheint wie erwartet zu funktionieren. Nach ein wenig Recherche fand ich heraus, dass e.relatedTarget das HTML ist, kurz bevor die Maus das Fenster verlässt .
Also ... ich habe am Ende folgendes:
document.body.addEventListener('mouseout', function(e) {
if (e.relatedTarget === document.querySelector('html')) {
console.log('We\'re OUT !');
}
});
Bitte lassen Sie mich wissen, wenn Sie Probleme oder Verbesserungen finden!
Update 2019
(wie user1084282 herausgefunden hat)
document.body.addEventListener('mouseout', function(e) {
if (!e.relatedTarget && !e.toElement) {
console.log('We\'re OUT !');
}
});
relatedTarget
ist null, wenn die Maus das Fenster verlässt. Inspiriert von der Antwort von @ user1084282, ändern Sie sie in diese: if(!e.relatedTarget && !e.toElement) { ... }
und es funktioniert
if(!e.relatedTarget && !e.toElement)
anstelle der Bedingung in der tatsächlichen Antwort verwenden. Es erkennt, dass die Maus den Dokumentkörper verlässt.
Ich nehme zurück, was ich gesagt habe. Es ist möglich. Ich habe diesen Code geschrieben, funktioniert perfekt.
window.onload = function() {
$span = document.getElementById('text');
window.onmouseout = function() {
$span.innerHTML = "mouse out";
}
window.onmousemove = function() {
$span.innerHTML = "mouse in";
}
}
arbeitet in Chrom, Firefox, Oper. Aint im IE getestet, aber davon ausgehen, dass es funktioniert.
bearbeiten. IE verursacht wie immer Probleme. Ersetzen Sie die Ereignisse vom Fenster zum Dokument, damit es im IE funktioniert:
window.onload = function() {
$span = document.getElementById('text');
document.onmousemove = function() {
$span.innerHTML = "mouse move";
}
document.onmouseout = function() {
$span.innerHTML = "mouse out";
}
}
Kombiniere sie für die Crossbrowser Kick Ass Cursor Erkennung o0: P.
wende dieses CSS an:
html
{
height:100%;
}
Dadurch wird sichergestellt, dass das HTML-Element die gesamte Höhe des Fensters einnimmt.
Wenden Sie diese Abfrage an:
$("html").mouseleave(function(){
alert('mouse out');
});
Das Problem bei Mouseover und Mouseout besteht darin, dass das Ereignis ausgelöst wird, wenn Sie mit der Maus über HTML auf ein untergeordnetes Element fahren. Die Funktion, die ich gegeben habe, wird beim Bewegen eines untergeordneten Elements nicht ausgelöst. Es wird nur ausgelöst, wenn Sie mit der Maus aus dem Fenster fahren
Nur damit Sie wissen, dass Sie dies tun können, wenn der Benutzer im Fenster mauset:
$("html").mouseenter(function(){
alert('mouse enter');
});
Ich versuchte es nacheinander und fand damals die beste Antwort:
https://stackoverflow.com/a/3187524/985399
Ich überspringe alte Browser, um den Code für moderne Browser (IE9 +) zu verkürzen.
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>")
Hier sehen Sie die Browserunterstützung
Das war ziemlich kurz, dachte ich
Es blieb jedoch ein Problem bestehen, da "Mouseout" für alle Elemente im Dokument ausgelöst wurde .
Verwenden Sie Mouseleave , um dies zu verhindern (IE5.5 +) . Siehe die gute Erklärung im Link.
Der folgende Code funktioniert ohne Auslösen von Elementen innerhalb des Elements, die sich innerhalb oder außerhalb befinden. Versuchen Sie auch, die Datei außerhalb des Dokuments zu ziehen.
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>")
Sie können das Ereignis für jedes HTML-Element festlegen. Das Ereignis document.body
ist jedoch nicht aktiviert, da die Windows-Bildlaufleiste möglicherweise den Körper verkleinert und ausgelöst wird, wenn sich der Mauszeiger über der Bildlaufleiste befindet, wenn Sie einen Bildlauf durchführen möchten, aber kein mouseLeave-Ereignis darüber auslösen möchten. Aktivieren Sie es document
stattdessen wie im Beispiel.
Wenn Sie OnMouseOver ständig im Body-Tag anhören, wird es möglicherweise zurückgerufen, wenn das Ereignis nicht auftritt. Wie Zack feststellt, kann dies jedoch sehr hässlich sein, da nicht alle Browser Ereignisse auf die gleiche Weise behandeln, es gibt sogar einige Möglichkeit, dass Sie den MouseOver verlieren, selbst wenn Sie sich über einem Div auf derselben Seite befinden.
Vielleicht würde dies einigen von denen helfen, die später hierher kommen.
window.onblur
und document.mouseout
.
window.onblur
wird ausgelöst, wenn:
Ctrl+Tab
oder zu einem anderen FensterCmd+Tab
.Grundsätzlich verliert DIESER Browser-Tab jedes Mal den Fokus.
window.onblur = function(){
console.log("Focus Out!")
}
document.mouseout
wird ausgelöst, wenn:
Ctrl+Tab
oder zu einem anderen FensterCmd+Tab
.Grundsätzlich in jedem Fall, wenn Ihr Cursor das Dokument verlässt.
document.onmouseleave = function(){
console.log("Mouse Out!")
}
window.onblur
. +1
$(window).mouseleave(function() {
alert('mouse leave');
});
Das hat bei mir funktioniert. Eine Kombination einiger Antworten hier. Und ich habe den Code, der ein Modell zeigt, nur einmal eingefügt. Und das Modell verschwindet, wenn es irgendwo anders angeklickt wird.
<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>