Saya ingin dapat mendeteksi saat mouse meninggalkan jendela sehingga saya dapat menghentikan pengaktifan peristiwa saat mouse pengguna berada di tempat lain.
Ada ide bagaimana melakukan ini?
Saya ingin dapat mendeteksi saat mouse meninggalkan jendela sehingga saya dapat menghentikan pengaktifan peristiwa saat mouse pengguna berada di tempat lain.
Ada ide bagaimana melakukan ini?
Jawaban:
Jenis perilaku ini biasanya diinginkan saat menerapkan perilaku seret-lepas di halaman html. Solusi di bawah ini telah diuji pada IE 8.0.6, FireFox 3.6.6, Opera 10.53, dan Safari 4 pada mesin MS Windows XP.
Pertama, fungsi kecil dari Peter-Paul Koch; penangan acara lintas browser:
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}
Dan kemudian gunakan metode ini untuk melampirkan event handler ke objek dokumen mouseout event:
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");
}
});
Terakhir, berikut adalah halaman html dengan skrip yang disematkan untuk debugging:
<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>
Jika Anda menggunakan jQuery, bagaimana dengan kode pendek dan manis ini -
$(document).mouseleave(function () {
console.log('out');
});
Peristiwa ini akan terpicu setiap kali mouse tidak ada di halaman Anda seperti yang Anda inginkan. Ubah saja fungsinya untuk melakukan apa pun yang Anda inginkan.
Dan Anda juga bisa menggunakan:
$(document).mouseenter(function () {
console.log('in');
});
Untuk memicu ketika mouse masuk kembali ke halaman itu lagi.
Ini bekerja untuk saya:
addEvent(document, 'mouseout', function(evt) {
if (evt.toElement == null && evt.relatedTarget == null) {
alert("left window");
}
});
addEvent
?
if (!evt.toElement && !evt.relatedTarget)
Untuk mendeteksi mouseleave tanpa memperhitungkan scroll bar dan kolom lengkapi otomatis atau periksa:
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");
}
});
Penjelasan kondisi:
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") tampaknya tidak diaktifkan pada versi firefox baru, mouseleave perlu dilampirkan ke elemen seperti body, atau elemen turunan.
Saya menyarankan untuk menggunakan sebagai gantinya
document.body.addEventListener("mouseleave")
Atau
window.addEventListener("mouseout")
Menggunakan acara onMouseLeave mencegah gelembung menggelembung dan memungkinkan Anda mendeteksi dengan mudah saat mouse meninggalkan jendela browser.
<html onmouseleave="alert('You left!')"></html>
document.onmouseleave = function() { alert('You left!') };
Gunakan bukan document.body yang menembakkan di atas scroll bar yang mengecilkan tubuh! Kode untuk mencegah kebakaran pada elemen tidak diperlukan. Penjelasan yang bagus: developer.mozilla.org/en-US/docs/Web/API/Element/…
Tak satu pun dari jawaban ini berhasil untuk saya. Saya sekarang menggunakan:
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');
}
});
Saya menggunakan ini untuk widget pengunggahan file seret dan lepas. Ini tidak sepenuhnya akurat, dipicu saat mouse mencapai jarak tertentu dari tepi jendela.
Saya sudah mencoba semua hal di atas, tetapi tidak ada yang berfungsi seperti yang diharapkan. Setelah sedikit riset, saya menemukan bahwa e.relatedTarget adalah html tepat sebelum mouse keluar dari jendela .
Jadi ... saya berakhir dengan ini:
document.body.addEventListener('mouseout', function(e) {
if (e.relatedTarget === document.querySelector('html')) {
console.log('We\'re OUT !');
}
});
Beri tahu saya jika Anda menemukan masalah atau peningkatan!
Pembaruan 2019
(seperti yang ditemukan pengguna1084282)
document.body.addEventListener('mouseout', function(e) {
if (!e.relatedTarget && !e.toElement) {
console.log('We\'re OUT !');
}
});
relatedTarget
adalah null saat mouse meninggalkan jendela. Terinspirasi oleh jawaban @ user1084282, ubah menjadi ini: if(!e.relatedTarget && !e.toElement) { ... }
dan berfungsi
if(!e.relatedTarget && !e.toElement)
alih-alih kondisi di jawaban yang sebenarnya. Ini mendeteksi mouse meninggalkan badan dokumen.
Saya menarik kembali apa yang saya katakan. Itu mungkin. Saya menulis kode ini, bekerja dengan sempurna.
window.onload = function() {
$span = document.getElementById('text');
window.onmouseout = function() {
$span.innerHTML = "mouse out";
}
window.onmousemove = function() {
$span.innerHTML = "mouse in";
}
}
bekerja di chrome, firefox, opera. Tidak diuji di IE, tetapi asumsikan berhasil.
edit. IE selalu menyebabkan masalah. Untuk membuatnya berfungsi di IE, ganti acara dari jendela ke dokumen:
window.onload = function() {
$span = document.getElementById('text');
document.onmousemove = function() {
$span.innerHTML = "mouse move";
}
document.onmouseout = function() {
$span.innerHTML = "mouse out";
}
}
menggabungkannya untuk deteksi kursor crossbrowser kick ass o0: P
terapkan css ini:
html
{
height:100%;
}
Ini memastikan bahwa elemen html memenuhi seluruh tinggi jendela.
terapkan jquery ini:
$("html").mouseleave(function(){
alert('mouse out');
});
Masalah dengan gerakan mouse dan gerakan mouse adalah bahwa jika Anda mengarahkan mouse ke atas / keluar dari html ke elemen anak itu akan memicu acara. Fungsi yang saya berikan tidak diaktifkan saat mengarahkan mouse ke elemen anak. Ini hanya menyala ketika Anda mengarahkan mouse ke luar / masuk jendela
hanya untuk Anda ketahui, Anda dapat melakukannya saat pengguna mengarahkan mouse di jendela:
$("html").mouseenter(function(){
alert('mouse enter');
});
Saya mencoba satu demi satu dan menemukan jawaban terbaik pada saat itu:
https://stackoverflow.com/a/3187524/985399
Saya melewati peramban lama jadi saya mempersingkat kodenya untuk bekerja di peramban modern (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>")
Di sini Anda melihat dukungan browser
Itu cukup singkat, pikirku
Namun masalah tetap ada karena "mouseout" memicu semua elemen dalam dokumen .
Untuk mencegahnya, gunakan mouseleave (IE5.5 +). Lihat penjelasan bagusnya di link.
Kode berikut bekerja tanpa memicu elemen di dalam elemen berada di dalam atau di luar. Coba juga drag-release di luar dokumen.
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>")
Anda dapat mengatur acara di elemen HTML apa pun. document.body
Namun, jangan biarkan acara tersebut aktif , karena bilah gulir jendela dapat mengecilkan isi dan menyala saat penunjuk mouse berada di atas bilah gulir saat Anda ingin menggulir tetapi tidak ingin memicu peristiwa mouseLeave di atasnya. Nyalakan saja document
, seperti pada contoh.
Mungkin jika Anda terus-menerus mendengarkan OnMouseOver di tag body, maka callback saat acara tidak terjadi, tetapi, seperti yang dikatakan Zack, ini bisa sangat buruk, karena tidak semua browser menangani acara dengan cara yang sama, bahkan ada beberapa kemungkinan bahwa Anda kehilangan MouseOver bahkan dengan berada di atas div di halaman yang sama.
Mungkin ini akan membantu beberapa dari mereka yang datang ke sini nanti.
window.onblur
dandocument.mouseout
.
window.onblur
dipicu ketika:
Ctrl+Tab
atauCmd+Tab
.Pada dasarnya setiap kali tab browser kehilangan fokus.
window.onblur = function(){
console.log("Focus Out!")
}
document.mouseout
dipicu ketika:
Ctrl+Tab
atau Cmd+Tab
.Pada dasarnya kapan pun kursor Anda meninggalkan dokumen.
document.onmouseleave = function(){
console.log("Mouse Out!")
}
window.onblur
juga. +1
$(window).mouseleave(function() {
alert('mouse leave');
});
Ini berhasil untuk saya. Kombinasi dari beberapa jawaban di sini. Dan saya memasukkan kode yang menunjukkan model hanya sekali. Dan model tersebut akan hilang saat diklik di tempat lain.
<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>