Tôi muốn có thể phát hiện khi con chuột rời khỏi cửa sổ để có thể ngăn các sự kiện kích hoạt trong khi con chuột của người dùng ở nơi khác.
Bất kỳ ý tưởng về cách làm điều này?
Tôi muốn có thể phát hiện khi con chuột rời khỏi cửa sổ để có thể ngăn các sự kiện kích hoạt trong khi con chuột của người dùng ở nơi khác.
Bất kỳ ý tưởng về cách làm điều này?
Câu trả lời:
Loại hành vi này thường được mong muốn trong khi thực hiện hành vi kéo-thả trên một trang html. Giải pháp dưới đây đã được thử nghiệm trên IE 8.0.6, FireFox 3.6.6, Opera 10.53 và Safari 4 trên máy MS Windows XP.
Đầu tiên là một chức năng nhỏ của Peter-Paul Koch; trình xử lý sự kiện trình duyệt chéo:
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}
Và sau đó sử dụng phương pháp này để đính kèm một trình xử lý sự kiện vào sự kiện mouseout đối tượng tài liệu:
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");
}
});
Cuối cùng, đây là một trang html với tập lệnh được nhúng để gỡ lỗi:
<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>
Nếu bạn đang sử dụng jQuery thì làm thế nào về đoạn mã ngắn và hấp dẫn này -
$(document).mouseleave(function () {
console.log('out');
});
Sự kiện này sẽ kích hoạt bất cứ khi nào con chuột không ở trong trang của bạn như bạn muốn. Chỉ cần thay đổi chức năng để làm bất cứ điều gì bạn muốn.
Và bạn cũng có thể sử dụng:
$(document).mouseenter(function () {
console.log('in');
});
Để kích hoạt khi chuột quay lại trang một lần nữa.
Điều này phù hợp với tôi:
addEvent(document, 'mouseout', function(evt) {
if (evt.toElement == null && evt.relatedTarget == null) {
alert("left window");
}
});
addEvent
gì?
if (!evt.toElement && !evt.relatedTarget)
Để phát hiện mouseleave mà không tính đến thanh cuộn và trường tự động hoàn thành hoặc kiểm tra:
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");
}
});
Giải thích điều kiện:
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
======================== CHỈNH SỬA ========================= ======
document.addEventListener ("mouseleave") dường như không được kích hoạt trên phiên bản firefox mới, mouseleave cần được đính kèm với một phần tử như body hoặc một phần tử con.
Tôi đề nghị sử dụng thay thế
document.body.addEventListener("mouseleave")
Hoặc là
window.addEventListener("mouseout")
Sử dụng sự kiện onMouseLeave ngăn chặn hiện tượng nổi bọt và cho phép bạn dễ dàng phát hiện khi chuột rời khỏi cửa sổ trình duyệt.
<html onmouseleave="alert('You left!')"></html>
document.onmouseleave = function() { alert('You left!') };
Không sử dụng document.body kích hoạt các thanh cuộn abowe thu nhỏ phần thân! Mã ngăn cháy trên các phần tử là không cần thiết. Giải thích hay: developer.mozilla.org/en-US/docs/Web/API/Element/…
Không câu trả lời nào trong số này phù hợp với tôi. Tôi hiện đang sử dụng:
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');
}
});
Tôi đang sử dụng cái này cho tiện ích tải lên tệp kéo và thả. Nó không chính xác tuyệt đối, được kích hoạt khi con chuột đến một khoảng cách nhất định từ mép cửa sổ.
Tôi đã thử tất cả các cách trên, nhưng dường như không có gì hoạt động như mong đợi. Sau khi nghiên cứu một chút, tôi phát hiện ra rằng e.osystemTarget là html ngay trước khi con chuột thoát khỏi cửa sổ .
Vì vậy ... tôi kết thúc với điều này:
document.body.addEventListener('mouseout', function(e) {
if (e.relatedTarget === document.querySelector('html')) {
console.log('We\'re OUT !');
}
});
Vui lòng cho tôi biết nếu bạn tìm thấy bất kỳ vấn đề hoặc cải tiến nào!
Cập nhật 2019
(như người dùng1084282 đã phát hiện ra)
document.body.addEventListener('mouseout', function(e) {
if (!e.relatedTarget && !e.toElement) {
console.log('We\'re OUT !');
}
});
relatedTarget
là null khi chuột rời khỏi cửa sổ. Lấy cảm hứng từ câu trả lời @ user1084282 của, thay đổi nó như thế này: if(!e.relatedTarget && !e.toElement) { ... }
và nó hoạt động
if(!e.relatedTarget && !e.toElement)
thay vì điều kiện trong câu trả lời thực tế. Nó phát hiện con chuột rời khỏi nội dung tài liệu.
Tôi rút lại những gì tôi đã nói. Điều đó là có thể. Tôi đã viết mã này, hoạt động hoàn hảo.
window.onload = function() {
$span = document.getElementById('text');
window.onmouseout = function() {
$span.innerHTML = "mouse out";
}
window.onmousemove = function() {
$span.innerHTML = "mouse in";
}
}
hoạt động trong chrome, firefox, opera. Aint đã thử nghiệm trong IE nhưng cho rằng nó hoạt động.
biên tập. IE luôn gây ra rắc rối. Để làm cho nó hoạt động trong IE, hãy thay thế các sự kiện từ cửa sổ sang tài liệu:
window.onload = function() {
$span = document.getElementById('text');
document.onmousemove = function() {
$span.innerHTML = "mouse move";
}
document.onmouseout = function() {
$span.innerHTML = "mouse out";
}
}
kết hợp chúng để phát hiện con trỏ đá đít crossbrowser o0: P
áp dụng css này:
html
{
height:100%;
}
Điều này đảm bảo rằng phần tử html chiếm toàn bộ chiều cao của cửa sổ.
áp dụng jquery này:
$("html").mouseleave(function(){
alert('mouse out');
});
Vấn đề với việc di chuột qua và di chuột là nếu bạn di chuột qua / ra khỏi html đến một phần tử con, nó sẽ gây ra sự kiện. Chức năng tôi đã cung cấp không được thiết lập khi di chuyển đến phần tử con. Nó chỉ được thiết lập khi bạn di chuột ra / vào cửa sổ
chỉ để bạn biết rằng bạn có thể làm điều đó khi người dùng di chuột vào cửa sổ:
$("html").mouseenter(function(){
alert('mouse enter');
});
Tôi đã thử lần lượt và tìm ra câu trả lời tốt nhất tại thời điểm đó:
https://stackoverflow.com/a/3187524/985399
Tôi bỏ qua các trình duyệt cũ nên đã tạo mã ngắn hơn để hoạt động trên các trình duyệt hiện đại (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>")
Ở đây bạn thấy hỗ trợ của trình duyệt
Đó là khá ngắn tôi nghĩ
Nhưng một vấn đề vẫn còn vì "mouseout" đã kích hoạt tất cả các phần tử trong tài liệu .
Để ngăn điều đó xảy ra, hãy sử dụng mouseleave (IE5.5 +). Xem lời giải thích hay trong liên kết.
Đoạn mã sau hoạt động mà không cần kích hoạt các phần tử bên trong phần tử là bên trong hoặc bên ngoài của. Cũng thử kéo-thả bên ngoài tài liệu.
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>")
Bạn có thể đặt sự kiện trên bất kỳ phần tử HTML nào. document.body
Mặc dù vậy, không nên bật sự kiện vì thanh cuộn của cửa sổ có thể thu nhỏ phần thân và kích hoạt khi con trỏ chuột ở phía sau thanh cuộn khi bạn muốn cuộn nhưng không muốn nhấn chuột Để lại sự kiện trên đó. document
Thay vào đó, hãy đặt nó lên , như trong ví dụ.
Có thể nếu bạn liên tục nghe OnMouseOver trong thẻ body, sau đó gọi lại khi sự kiện không xảy ra, nhưng, như Zack nói, điều này có thể rất xấu, bởi vì không phải tất cả các trình duyệt đều xử lý các sự kiện theo cùng một cách, thậm chí có một số khả năng bạn mất MouseOver ngay cả khi vượt qua một div trong cùng một trang.
Có lẽ điều này sẽ giúp ích cho một số người đến đây sau này.
window.onblur
và document.mouseout
.
window.onblur
được kích hoạt khi:
Ctrl+Tab
hoặc Cmd+Tab
.Về cơ bản, bất cứ lúc nào tab trình duyệt đó đều mất tiêu điểm.
window.onblur = function(){
console.log("Focus Out!")
}
document.mouseout
được kích hoạt khi:
Ctrl+Tab
hoặc Cmd+Tab
.Về cơ bản trong mọi trường hợp khi con trỏ của bạn rời khỏi tài liệu.
document.onmouseleave = function(){
console.log("Mouse Out!")
}
window.onblur
quá. +1
$(window).mouseleave(function() {
alert('mouse leave');
});
Điều này đã làm việc cho tôi. Sự kết hợp của một số câu trả lời ở đây. Và tôi đã bao gồm mã hiển thị một mô hình chỉ một lần. Và mô hình sẽ biến mất khi được nhấp vào bất kỳ nơi nào khác.
<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>