사용자의 마우스가 다른 곳에있는 동안 이벤트 발생을 중지 할 수 있도록 마우스가 창을 떠날 때를 감지 할 수 있기를 원합니다.
이를 수행하는 방법에 대한 아이디어가 있습니까?
사용자의 마우스가 다른 곳에있는 동안 이벤트 발생을 중지 할 수 있도록 마우스가 창을 떠날 때를 감지 할 수 있기를 원합니다.
이를 수행하는 방법에 대한 아이디어가 있습니까?
답변:
이러한 유형의 동작은 일반적으로 html 페이지에서 끌어서 놓기 동작을 구현할 때 필요합니다. 아래 솔루션은 MS Windows XP 시스템의 IE 8.0.6, FireFox 3.6.6, Opera 10.53 및 Safari 4에서 테스트되었습니다.
먼저 Peter-Paul Koch의 작은 기능입니다. 크로스 브라우저 이벤트 핸들러 :
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}
그런 다음이 메서드를 사용하여 이벤트 핸들러를 문서 객체 mouseout 이벤트에 연결합니다.
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");
}
});
마지막으로 디버깅을 위해 스크립트가 포함 된 html 페이지가 있습니다.
<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>
jQuery를 사용하는 경우이 짧고 달콤한 코드는 어떻습니까?
$(document).mouseleave(function () {
console.log('out');
});
이 이벤트는 원하는대로 페이지에 마우스가 없을 때마다 트리거됩니다. 원하는대로 기능을 변경하면됩니다.
다음을 사용할 수도 있습니다.
$(document).mouseenter(function () {
console.log('in');
});
마우스가 페이지로 다시 들어갈 때 트리거합니다.
이것은 나를 위해 작동합니다.
addEvent(document, 'mouseout', function(evt) {
if (evt.toElement == null && evt.relatedTarget == null) {
alert("left window");
}
});
addEvent
?
if (!evt.toElement && !evt.relatedTarget)
스크롤 막대와 autcomplete 필드를 고려하지 않고 mouseleave를 감지하거나 검사하려면 다음을 수행하십시오.
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");
}
});
조건 설명 :
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
======================= 편집 ======================== ======
document.addEventListener ( "mouseleave")는 새 파이어 폭스 버전에서 실행되지 않는 것 같습니다. mouseleave는 body 또는 자식 요소와 같은 요소에 첨부되어야합니다.
대신 사용하는 것이 좋습니다
document.body.addEventListener("mouseleave")
또는
window.addEventListener("mouseout")
onMouseLeave 이벤트를 사용하면 버블 링을 방지하고 마우스가 브라우저 창을 벗어날 때 쉽게 감지 할 수 있습니다.
<html onmouseleave="alert('You left!')"></html>
document.onmouseleave = function() { alert('You left!') };
본문을 축소하는 스크롤 막대를 실행하는 document.body를 사용하지 마십시오! 요소에 대한 화재를 방지하는 코드는 필요하지 않습니다. 좋은 설명 : developer.mozilla.org/en-US/docs/Web/API/Element/…
이 답변 중 어느 것도 나를 위해 일하지 않았습니다. 나는 지금 사용하고 있습니다 :
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');
}
});
드래그 앤 드롭 파일 업로드 위젯에 사용하고 있습니다. 절대적으로 정확하지는 않으며 마우스가 창 가장자리에서 특정 거리에 도달하면 트리거됩니다.
위의 모든 것을 시도했지만 예상대로 작동하지 않는 것 같습니다. 약간의 조사 끝에 나는 e.relatedTarget 이 마우스가 창을 나가기 직전 의 html 이라는 것을 발견했습니다 .
그래서 ... 나는 이것으로 끝났습니다.
document.body.addEventListener('mouseout', function(e) {
if (e.relatedTarget === document.querySelector('html')) {
console.log('We\'re OUT !');
}
});
문제 나 개선 사항이 있으면 알려주십시오!
2019 업데이트
(user1084282가 알아 낸대로)
document.body.addEventListener('mouseout', function(e) {
if (!e.relatedTarget && !e.toElement) {
console.log('We\'re OUT !');
}
});
relatedTarget
마우스가 창을 떠날 때 null입니다. @ user1084282의 대답에 의해 영감이로 변경 : if(!e.relatedTarget && !e.toElement) { ... }
그것은 작동
if(!e.relatedTarget && !e.toElement)
실제 답변의 조건 대신 사용하면 Chrome, Firefox 및 IE Edge에서 제대로 작동하는지 확인합니다 . 마우스가 문서 본문을 떠나는 것을 감지합니다.
나는 내가 말한 것을 되 돌린다. 것이 가능하다. 이 코드를 작성하고 완벽하게 작동합니다.
window.onload = function() {
$span = document.getElementById('text');
window.onmouseout = function() {
$span.innerHTML = "mouse out";
}
window.onmousemove = function() {
$span.innerHTML = "mouse in";
}
}
크롬, 파이어 폭스, 오페라에서 작동합니다. IE에서 테스트되지 않았지만 작동한다고 가정합니다.
편집하다. IE는 항상 문제를 일으 킵니다. IE에서 작동하도록하려면 창에서 문서로 이벤트를 바꿉니다.
window.onload = function() {
$span = document.getElementById('text');
document.onmousemove = function() {
$span.innerHTML = "mouse move";
}
document.onmouseout = function() {
$span.innerHTML = "mouse out";
}
}
crossbrowser kick ass cursor detection o0 : P를 위해 그것들을 결합하십시오.
이 CSS를 적용하십시오.
html
{
height:100%;
}
이렇게하면 html 요소가 창의 전체 높이를 차지하게됩니다.
이 jquery를 적용하십시오.
$("html").mouseleave(function(){
alert('mouse out');
});
mouseover 및 mouseout의 문제는 html에서 자식 요소에 마우스를 가져 가면 이벤트가 시작된다는 것입니다. 내가 준 기능 은 자식 요소에 마우스를 놓을 때 설정 되지 않습니다 . 창 밖으로 / 마우스를 내밀 때만 설정됩니다.
사용자가 창에서 마우스를 움직일 때 할 수 있다는 것을 알기 위해 :
$("html").mouseenter(function(){
alert('mouse enter');
});
나는 차례로 시도했고 당시 최고의 답변을 찾았습니다.
https://stackoverflow.com/a/3187524/985399
오래된 브라우저를 건너 뛰어 최신 브라우저 (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>")
여기에서 브라우저 지원이 표시됩니다.
내가 생각하기에 꽤 짧았 어
그러나 문서의 모든 요소에 대한 "마우스 아웃"트리거 때문에 문제가 여전히 남아 있습니다. .
이를 방지하려면 mouseleave를 사용 하십시오. (IE5.5 +)를 사용하십시오. 링크에서 좋은 설명을 참조하십시오.
다음 코드는 내부 또는 외부에있는 요소 내부의 요소를 트리거하지 않고 작동합니다. 문서 외부로 끌어서 놓아보십시오.
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>")
모든 HTML 요소에 이벤트를 설정할 수 있습니다. 이벤트를 설정하지 마십시오 document.body
. 스크롤을 원할 때 마우스 포인터가 스크롤 막대 위에있을 때 창 스크롤바가 본문을 축소하고 발동 될 수 있지만 mouseLeave 이벤트를 그 위에 트리거하지 않습니다. document
예에서와 같이 대신 설정하십시오 .
본문 태그에서 OnMouseOver를 지속적으로 듣고 있다면 이벤트가 발생하지 않을 때 콜백 할 수 있지만 Zack이 언급했듯이 모든 브라우저가 동일한 방식으로 이벤트를 처리하는 것은 아니기 때문에 매우 추할 수 있습니다. 같은 페이지에서 div 위에 있어도 MouseOver를 잃을 가능성이 있습니다.
아마도 이것은 나중에 여기 오는 사람들 중 일부를 도울 것입니다.
window.onblur
및 document.mouseout
.
window.onblur
다음과 같은 경우에 트리거됩니다.
Ctrl+Tab
또는Cmd+Tab
.기본적으로 브라우저 탭이 초점을 잃을 때마다.
window.onblur = function(){
console.log("Focus Out!")
}
document.mouseout
다음과 같은 경우에 트리거됩니다.
Ctrl+Tab
또는Cmd+Tab
.기본적으로 커서가 문서를 떠날 때.
document.onmouseleave = function(){
console.log("Mouse Out!")
}
window.onblur
도. +1
$(window).mouseleave(function() {
alert('mouse leave');
});
이것은 나를 위해 일했습니다. 여기에 몇 가지 답변의 조합입니다. 그리고 모델을 보여주는 코드를 한 번만 포함했습니다. 다른 곳을 클릭하면 모델이 사라집니다.
<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>