Chcę mieć możliwość wykrywania, kiedy mysz opuszcza okno, aby móc zatrzymać uruchamianie zdarzeń, gdy mysz użytkownika znajduje się w innym miejscu.
Jakieś pomysły, jak to zrobić?
Chcę mieć możliwość wykrywania, kiedy mysz opuszcza okno, aby móc zatrzymać uruchamianie zdarzeń, gdy mysz użytkownika znajduje się w innym miejscu.
Jakieś pomysły, jak to zrobić?
Odpowiedzi:
Ten typ zachowania jest zwykle pożądany podczas implementowania zachowania przeciągnij-upuść na stronie html. Poniższe rozwiązanie zostało przetestowane w przeglądarkach IE 8.0.6, FireFox 3.6.6, Opera 10.53 i Safari 4 na komputerze z systemem MS Windows XP.
Najpierw mała funkcja od Petera-Paula Kocha; obsługa zdarzeń w różnych przeglądarkach:
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}
Następnie użyj tej metody, aby dołączyć procedurę obsługi zdarzenia do zdarzenia mouseout obiektów dokumentu:
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");
}
});
Wreszcie, oto strona HTML ze skryptem osadzonym do debugowania:
<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>
Jeśli używasz jQuery, co powiesz na ten krótki i słodki kod -
$(document).mouseleave(function () {
console.log('out');
});
To zdarzenie będzie wywoływane za każdym razem, gdy na stronie nie ma myszy, tak jak chcesz. Po prostu zmień funkcję, aby robić, co chcesz.
Możesz też użyć:
$(document).mouseenter(function () {
console.log('in');
});
Aby wywołać, gdy mysz ponownie wejdzie na stronę.
To działa dla mnie:
addEvent(document, 'mouseout', function(evt) {
if (evt.toElement == null && evt.relatedTarget == null) {
alert("left window");
}
});
addEvent
?
if (!evt.toElement && !evt.relatedTarget)
Aby wykryć mouseleave bez uwzględnienia paska przewijania i pola autouzupełniania lub inspekcji:
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");
}
});
Warunki wyjaśnienia:
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
======================== EDYCJA ========================= ======
Document.addEventListener ("mouseleave") wydaje się nie uruchamiać w nowej wersji przeglądarki Firefox, mouseleave musi być dołączone do elementu takiego jak body lub elementu podrzędnego.
Proponuję zamiast tego użyć
document.body.addEventListener("mouseleave")
Lub
window.addEventListener("mouseout")
Użycie zdarzenia onMouseLeave zapobiega bulgotaniu i pozwala łatwo wykryć, kiedy mysz opuszcza okno przeglądarki.
<html onmouseleave="alert('You left!')"></html>
document.onmouseleave = function() { alert('You left!') };
nie używaj document.body, który odpala powyżej pasków przewijania, które zmniejszają ciało! Kod zapobiegający pożarowi elementów nie jest potrzebny. Dobre wyjaśnienie: developer.mozilla.org/en-US/docs/Web/API/Element/ ...
Żadna z tych odpowiedzi nie zadziałała dla mnie. Teraz używam:
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');
}
});
Używam tego do przeciągania i upuszczania widżetu do przesyłania plików. Nie jest to całkowicie dokładne, ponieważ jest uruchamiane, gdy mysz znajdzie się w pewnej odległości od krawędzi okna.
Wypróbowałem wszystkie powyższe, ale nic nie działa zgodnie z oczekiwaniami. Po krótkich poszukiwaniach odkryłem, że e.relatedTarget to kod HTML tuż przed wyjściem myszy z okna .
Więc ... Skończyło się na tym:
document.body.addEventListener('mouseout', function(e) {
if (e.relatedTarget === document.querySelector('html')) {
console.log('We\'re OUT !');
}
});
Daj mi znać, jeśli znajdziesz jakieś problemy lub ulepszenia!
Aktualizacja 2019
(jak dowiedział się użytkownik1084282)
document.body.addEventListener('mouseout', function(e) {
if (!e.relatedTarget && !e.toElement) {
console.log('We\'re OUT !');
}
});
relatedTarget
jest zerowa, gdy mysz opuszcza okno. Zainspirowany odpowiedzią @ user1084282, zmień to na to: if(!e.relatedTarget && !e.toElement) { ... }
i działa
if(!e.relatedTarget && !e.toElement)
zamiast warunku w rzeczywistej odpowiedzi. Wykrywa, że mysz opuszcza treść dokumentu.
Cofam to, co powiedziałem. To jest możliwe. Napisałem ten kod, działa idealnie.
window.onload = function() {
$span = document.getElementById('text');
window.onmouseout = function() {
$span.innerHTML = "mouse out";
}
window.onmousemove = function() {
$span.innerHTML = "mouse in";
}
}
działa w chrome, firefox, opera. Nie testowano w IE, ale załóżmy, że działa.
edytować. IE jak zawsze sprawia kłopoty. Aby to działało w IE, zamień zdarzenia z okna na dokument:
window.onload = function() {
$span = document.getElementById('text');
document.onmousemove = function() {
$span.innerHTML = "mouse move";
}
document.onmouseout = function() {
$span.innerHTML = "mouse out";
}
}
połącz je, aby wykryć kursor wykopu między przeglądarkami o0: P
zastosuj ten CSS:
html
{
height:100%;
}
Dzięki temu element html zajmie całą wysokość okna.
zastosuj to jquery:
$("html").mouseleave(function(){
alert('mouse out');
});
Problem z najechaniem myszą i wyprowadzeniem myszy polega na tym, że jeśli przesuniesz kursor myszy na element podrzędny lub najedziesz kursorem na element podrzędny, spowoduje to wyzwolenie zdarzenia. Funkcja, którą podałem, nie jest włączana po najechaniu myszą na element potomny. Jest wyłączany tylko po najechaniu kursorem myszy na okno
tylko po to, żebyś wiedział, że możesz to zrobić, gdy użytkownik najedzie myszką w oknie:
$("html").mouseenter(function(){
alert('mouse enter');
});
Próbowałem jeden po drugim i wtedy znalazłem najlepszą odpowiedź:
https://stackoverflow.com/a/3187524/985399
Pomijam stare przeglądarki, więc skróciłem kod do pracy na nowoczesnych przeglądarkach (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>")
Tutaj widzisz obsługę przeglądarki
Pomyślałem, że to było dość krótkie
Ale problem nadal występował, ponieważ "mouseout" uruchamiał się na wszystkich elementach w dokumencie .
Aby temu zapobiec, użyj mouseleave (IE5.5 +). Zobacz dobre wyjaśnienie w linku.
Poniższy kod działa bez wyzwalania elementów wewnątrz elementu, które mają znajdować się wewnątrz lub na zewnątrz. Spróbuj także przeciągnąć i zwolnić poza dokumentem.
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>")
Możesz ustawić zdarzenie na dowolnym elemencie HTML. Nie document.body
włączaj jednak zdarzenia, ponieważ pasek przewijania w systemie Windows może zmniejszać zawartość i uruchamiać się, gdy wskaźnik myszy znajduje się nad paskiem przewijania, gdy chcesz przewijać, ale nie chcesz wyzwalać zdarzenia mouseLeave nad nim. document
Zamiast tego włącz go , jak w przykładzie.
Może jeśli ciągle słuchasz OnMouseOver w tagu body, wtedy wywołanie zwrotne, gdy zdarzenie nie występuje, ale, jak twierdzi Zack, może to być bardzo brzydkie, ponieważ nie wszystkie przeglądarki obsługują zdarzenia w ten sam sposób, jest nawet kilka możliwość, że stracisz MouseOver, nawet jeśli znajdziesz się nad elementem div na tej samej stronie.
Może to pomogłoby niektórym z tych, którzy przyjadą tu później.
window.onblur
idocument.mouseout
.
window.onblur
jest uruchamiany, gdy:
Ctrl+Tab
lubCmd+Tab
.Zasadniczo za każdym razem, gdy TA karta przeglądarki traci fokus.
window.onblur = function(){
console.log("Focus Out!")
}
document.mouseout
jest uruchamiany, gdy:
Ctrl+Tab
lubCmd+Tab
.Zasadniczo w każdym przypadku, gdy kursor opuszcza dokument.
document.onmouseleave = function(){
console.log("Mouse Out!")
}
window.onblur
. +1
$(window).mouseleave(function() {
alert('mouse leave');
});
To zadziałało dla mnie. Połączenie niektórych odpowiedzi tutaj. I tylko raz zamieściłem kod pokazujący model. Model znika po kliknięciu w innym miejscu.
<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>