Farenin pencereden ne zaman ayrıldığını algılayabilmek istiyorum, böylece kullanıcının faresi başka bir yerdeyken olayların tetiklenmesini durdurabilirim.
Bunun nasıl yapılacağına dair bir fikriniz var mı?
Farenin pencereden ne zaman ayrıldığını algılayabilmek istiyorum, böylece kullanıcının faresi başka bir yerdeyken olayların tetiklenmesini durdurabilirim.
Bunun nasıl yapılacağına dair bir fikriniz var mı?
Yanıtlar:
Bu tür bir davranış, genellikle bir html sayfasında sürükle bırak davranışı uygulanırken istenir. Aşağıdaki çözüm bir MS Windows XP makinesinde IE 8.0.6, FireFox 3.6.6, Opera 10.53 ve Safari 4 üzerinde test edilmiştir.
Önce Peter-Paul Koch'tan küçük bir fonksiyon; tarayıcılar arası olay işleyicisi:
function addEvent(obj, evt, fn) {
if (obj.addEventListener) {
obj.addEventListener(evt, fn, false);
}
else if (obj.attachEvent) {
obj.attachEvent("on" + evt, fn);
}
}
Ve sonra, belge nesneleri mouseout olayına bir olay işleyicisi eklemek için bu yöntemi kullanın:
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");
}
});
Son olarak, hata ayıklama için katıştırılmış komut dosyası içeren bir html sayfası:
<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 kullanıyorsanız, bu kısa ve tatlı koda ne dersiniz?
$(document).mouseleave(function () {
console.log('out');
});
Bu olay, fare istediğiniz gibi sayfanızda olmadığında tetiklenecektir. İstediğinizi yapmak için işlevi değiştirmeniz yeterlidir.
Ayrıca şunları da kullanabilirsiniz:
$(document).mouseenter(function () {
console.log('in');
});
Fare tekrar sayfaya girdiğinde tetiklemek için.
Bu benim için çalışıyor:
addEvent(document, 'mouseout', function(evt) {
if (evt.toElement == null && evt.relatedTarget == null) {
alert("left window");
}
});
addEvent
?
if (!evt.toElement && !evt.relatedTarget)
Fare çıkışını kaydırma çubuğunu ve eksik alanı hesaba katmadan tespit etmek veya incelemek için:
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");
}
});
Koşul açıklamaları:
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
======================== DÜZENLE ========================= ======
document.addEventListener ("mouseleave") yeni firefox sürümünde çalıştırılmamış gibi görünüyor, mouseleave'in body gibi bir öğeye veya bir alt öğeye eklenmesi gerekiyor.
Onun yerine kullanmayı öneririm
document.body.addEventListener("mouseleave")
Veya
window.addEventListener("mouseout")
OnMouseLeave olayını kullanmak köpürmeyi önler ve fare tarayıcı penceresinden çıktığında kolayca algılamanıza olanak tanır.
<html onmouseleave="alert('You left!')"></html>
document.onmouseleave = function() { alert('You left!') };
Gövdeyi küçülten kaydırma çubuklarına ateşleyen document.body kullanmayın! Elemanlarda yangını önlemek için kod gerekli değildir. İyi açıklama: developer.mozilla.org/en-US/docs/Web/API/Element/…
Bu cevapların hiçbiri benim için işe yaramadı. Şimdi kullanıyorum:
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');
}
});
Bunu bir sürükle ve bırak dosya yükleme gereci için kullanıyorum. Kesinlikle doğru değil, fare pencerenin kenarından belirli bir mesafeye geldiğinde tetikleniyor.
Yukarıdakilerin hepsini denedim, ancak hiçbir şey beklendiği gibi çalışmıyor. Biraz araştırmadan sonra bunu buldum e.relatedTarget olan html sadece fare penceresini çıkar önce .
Yani ... bununla son buldum:
document.body.addEventListener('mouseout', function(e) {
if (e.relatedTarget === document.querySelector('html')) {
console.log('We\'re OUT !');
}
});
Herhangi bir sorun veya gelişme bulursanız lütfen bana bildirin!
2019 Güncellemesi
(user1084282 bulduğu gibi)
document.body.addEventListener('mouseout', function(e) {
if (!e.relatedTarget && !e.toElement) {
console.log('We\'re OUT !');
}
});
relatedTarget
fare pencereden çıktığında boştur. @ User1084282'nin cevabından esinlenerek, bunu şöyle değiştirin: if(!e.relatedTarget && !e.toElement) { ... }
ve işe yarıyor
if(!e.relatedTarget && !e.toElement)
Gerçek cevaptaki koşul yerine kullanırsanız, bunun Chrome, Firefox ve IE Edge'de iyi çalıştığını onaylıyorum . Farenin belge gövdesini terk ettiğini algılar.
Dediğimi geri alıyorum. Bu mümkün. Bu kodu yazdım, mükemmel çalışıyor.
window.onload = function() {
$span = document.getElementById('text');
window.onmouseout = function() {
$span.innerHTML = "mouse out";
}
window.onmousemove = function() {
$span.innerHTML = "mouse in";
}
}
chrome, firefox, opera alanlarında çalışıyor. IE'de test edilmiyor, ancak çalıştığını varsayın.
Düzenle. IE her zaman olduğu gibi sorun yaratır. IE'de çalışmasını sağlamak için olayları pencereden belgeye değiştirin:
window.onload = function() {
$span = document.getElementById('text');
document.onmousemove = function() {
$span.innerHTML = "mouse move";
}
document.onmouseout = function() {
$span.innerHTML = "mouse out";
}
}
onları çapraz tarayıcı kick ass imleç algılaması için birleştirin o0: P
bu css'yi uygulayın:
html
{
height:100%;
}
Bu, html öğesinin pencerenin tüm yüksekliğini kaplamasını sağlar.
bu jquery'yi uygulayın:
$("html").mouseleave(function(){
alert('mouse out');
});
Fareyle üzerine gelme ve fareyi çekmeyle ilgili sorun, html'den bir alt öğeye fareyi getirip çıkardığınızda, olayı başlatacak olmasıdır. Verdiğim işlev , bir alt öğeye fareyle giderken çalışmıyor . Yalnızca fareyi pencereden dışarı / içeri doğru çektiğinizde kapanır
sadece kullanıcı pencerede fare gördüğünde yapabileceğinizi bilmeniz için:
$("html").mouseenter(function(){
alert('mouse enter');
});
Birbiri ardına denedim ve o sırada en iyi cevabı buldum:
https://stackoverflow.com/a/3187524/985399
Eski tarayıcıları atlıyorum, böylece kodu modern tarayıcılarda çalışması için kısalttım (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>")
Burada tarayıcı desteğini görüyorsunuz
Oldukça kısa olduğunu düşündüm
Ancak , belgedeki tüm öğelerde "fare çekme" tetiklendiği için bir sorun devam ediyor .
Bunun olmasını önlemek için mouseleave kullanın (IE5.5 +) kullanın. Bağlantıdaki iyi açıklamaya bakın.
Aşağıdaki kod, öğenin içindeki öğelerin içinde veya dışında olmasını tetiklemeden çalışır. Belgenin dışına da sürükleyip bırakmayı deneyin.
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>")
Etkinliği herhangi bir HTML öğesi üzerinde ayarlayabilirsiniz. Olayı document.body
açmayın, çünkü Windows kaydırma çubuğu gövdeyi küçültebilir ve kaydırma yapmak istediğinizde ancak üzerinde bir mouseLeave olayını tetiklemek istemediğinizde fare işaretçisi kaydırma çubuğunun altındayken yanabilir. Bunun document
yerine örnekteki gibi ayarlayın .
Belki vücut etiketinde OnMouseOver'ı sürekli dinliyorsanız, olay gerçekleşmediğinde geri arama yaparsanız, ancak Zack'in belirttiği gibi, bu çok çirkin olabilir, çünkü tüm tarayıcılar olayları aynı şekilde ele almaz, hatta bazıları vardır Aynı sayfadaki bir div'in üzerinde olsanız bile MouseOver'ı kaybetme olasılığı.
Belki bu, buraya daha sonra gelenlerin bazılarına yardımcı olabilir.
window.onblur
vedocument.mouseout
.
window.onblur
şu durumlarda tetiklenir:
Ctrl+Tab
veyaCmd+Tab
.Temelde, bu tarayıcı sekmesi odağı kaybettiğinde.
window.onblur = function(){
console.log("Focus Out!")
}
document.mouseout
şu durumlarda tetiklenir:
Ctrl+Tab
veyaCmd+Tab
.Temelde her durumda, imleciniz belgeden ayrıldığında.
document.onmouseleave = function(){
console.log("Mouse Out!")
}
window.onblur
da. +1
$(window).mouseleave(function() {
alert('mouse leave');
});
Bu benim için çalıştı. Buradaki bazı cevapların bir kombinasyonu. Ve bir modeli gösteren kodu yalnızca bir kez ekledim. Ve model başka bir yere tıklandığında kaybolur.
<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>