Я хочу, чтобы иметь возможность обнаруживать, когда мышь покидает окно, поэтому я могу остановить события от стрельбы, пока пользовательская мышь находится в другом месте.
Любые идеи о том, как это сделать?
Я хочу, чтобы иметь возможность обнаруживать, когда мышь покидает окно, поэтому я могу остановить события от стрельбы, пока пользовательская мышь находится в другом месте.
Любые идеи о том, как это сделать?
Этот тип поведения обычно требуется при реализации поведения перетаскивания на странице html. Решение ниже было протестировано на IE 8.0.6, FireFox 3.6.6, Opera 10.53 и Safari 4 на компьютере MS Windows XP.
Сначала небольшая функция от Петра-Поля Коха; кросс-браузер:
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-страница с script встроенным для отладки:
<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');
});
Для запуска, когда мышь снова вернется к странице.
Источник: fooobar.com/questions/33632/...
Это работает для меня:
addEvent(document, 'mouseout', function(evt) {
if (evt.toElement == null && evt.relatedTarget == null) {
alert("left window");
}
});
Чтобы обнаружить отпускание мыши без учета полосы прокрутки и поля автозаполнения или проверьте:
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('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');
}
});
Я использую это для перетаскивания виджета. Это не совсем точно, срабатывает, когда мышь приближается к определенному расстоянию от края окна.
Использование события onMouseLeave предотвращает барботирование и позволяет вам легко обнаруживать, когда мышь покидает окно браузера.
<html onmouseleave="alert('You left!')"></html>
Я возвращаю то, что сказал. Возможно. Я написал этот код, отлично работает.
window.onload = function() {
$span = document.getElementById('text');
window.onmouseout = function() {
$span.innerHTML = "mouse out";
}
window.onmousemove = function() {
$span.innerHTML = "mouse in";
}
}
работает в chrome, firefox, opera. Aint тестировался в 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 o0: P
Я пробовал все вышеперечисленное, но, похоже, ничего не работает, как ожидалось. После небольшого исследования я обнаружил, что e.relatedTarget - это HTML- код перед тем, как мышь покидает окно.
Итак... я в конечном итоге с этим:
document.body.addEventListener('mouseout', function(e) {
if (e.relatedTarget === document.querySelector('html')) {
console.log('We\'re OUT !');
}
});
Пожалуйста, дайте мне знать, если вы обнаружите какие-либо проблемы или улучшения!
2019 Обновление
(как выяснил пользователь1084282)
document.body.addEventListener('mouseout', function(e) {
if (!e.relatedTarget && !e.toElement) {
console.log('We\'re OUT !');
}
});
примените этот css:
html
{
height:100%;
}
Это гарантирует, что элемент html занимает всю высоту окна.
примените этот jquery:
$("html").mouseleave(function(){
alert('mouse out');
});
Проблема с mouseover и mouseout заключается в том, что если вы наведите указатель мыши на/из html на дочерний элемент, он закроет событие. Функция, которую я дал , не присваивается при перемещении к дочернему элементу. Он отключается только при выводе мыши/в окне
просто для того, чтобы вы знали, что можете сделать это, когда пользователь мыши будет в окне:
$("html").mouseenter(function(){
alert('mouse enter');
});
Возможно, если вы постоянно слушаете OnMouseOver в теге body, тогда обратный вызов, когда событие не происходит, но, как заявляет Зак, это может быть очень уродливо, поскольку не все браузеры обрабатывают события одинаково, там даже некоторая вероятность того, что вы потеряете MouseOver, даже находясь над div на той же странице.
Возможно, это поможет некоторым из тех, кто придет сюда позже.
window.onblur
и document.mouseout
.
window.onblur
запускается, когда:
Ctrl+Tab
или Cmd+Tab
.В принципе, в любой момент, когда вкладка браузера THAT теряет фокус.
window.onblur = function(){
console.log("Focus Out!")
}
document.mouseout
запускается, когда:
Ctrl+Tab
или Cmd+Tab
.В принципе, в любом случае, когда ваш курсор покидает документ.
document.onmouseleave = function(){
console.log("Mouse Out!")
}
$(window).mouseleave(function(event) {
if (event.toElement == null) {
//Do something
}
})
Это может быть немного взломанным, но оно будет срабатывать только тогда, когда мышь покидает окно. Я продолжал ловить детские события, и это разрешило это.
$(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>
Я попробовал один за другим и нашел принятый ответ выше, который на самом деле работает!
fooobar.com/questions/33625/...
Я пропускаю старые браузеры, поэтому я сократил код для работы в современных браузерах IE9+:
document.addEventListener("mouseout", function(e) {
let t = e.relatedTarget || e.toElement;
if (!t || t.nodeName == "HTML") {
console.log("left window");
}
});
Я не тестировал это, но моим инстинктом было бы сделать вызов функции OnMouseOut на теге body.
Это будет работать в chrome,
$(document).bind('dragleave', function (e) {
if (e.originalEvent.clientX == 0){
alert("left window");
}
});