ユーザーのマウスが他の場所にあるときにイベントが発生するのを停止できるように、マウスがウィンドウを離れたときにそれを検出できるようにしたいと考えています。
これを行う方法のアイデアはありますか?
ユーザーのマウスが他の場所にあるときにイベントが発生するのを停止できるように、マウスがウィンドウを離れたときにそれを検出できるようにしたいと考えています。
これを行う方法のアイデアはありますか?
回答:
このタイプの動作は、HTMLページにドラッグアンドドロップ動作を実装するときに通常は必要です。以下のソリューションは、MS Windows XPマシン上のIE 8.0.6、FireFox 3.6.6、Opera 10.53、およびSafari 4でテストされています。
最初にピーターポールコッホから少し関数; クロスブラウザーイベントハンドラー:
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
======================== EDIT ========================= ======
document.addEventListener( "mouseleave")は、Firefoxの新しいバージョンでは発生しないようです。mouseleaveは、bodyなどの要素または子要素にアタッチする必要があります。
代わりに使用することをお勧めします
document.body.addEventListener("mouseleave")
または
window.addEventListener("mouseout")
onMouseLeaveイベントを使用すると、バブリングが防止され、マウスがブラウザウィンドウを離れたときに簡単に検出できます。
<html onmouseleave="alert('You left!')"></html>
document.onmouseleave = function() { alert('You left!') };
本体を縮小するaboweスクロールバーを起動する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";
}
}
クロム、Firefox、オペラで動作します。IEではテストされていませんが、動作することを前提としています。
編集。IEはいつも問題を引き起こします。IEで機能させるには、イベントをウィンドウからドキュメントに置き換えます。
window.onload = function() {
$span = document.getElementById('text');
document.onmousemove = function() {
$span.innerHTML = "mouse move";
}
document.onmouseout = function() {
$span.innerHTML = "mouse out";
}
}
それらを組み合わせて、クロスブラウザキックアスカーソル検出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
ただし、イベントはありません。ウィンドウのスクロールバーが本体を縮小し、スクロールしたいがマウスリーブイベントをトリガーしたくないときに、マウスポインターがスクロールバーに曲がっているときに発生する可能性があるためです。document
例のように、代わりにオンに設定します。
多分これは後でここに来る人々の一部を助けるでしょう。
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');
});
これでうまくいきました。ここにいくつかの答えの組み合わせ。また、モデルを示すコードを1回だけ含めました。そして、モデルは他のどこかをクリックすると消えます。
<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>
mouseover
およびを参照してくださいmouseout
。
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>