当使用Firefox浏览器拖动窗口外时,dragleave
事件无法正常触发:
https://bugzilla.mozilla.org/show_bug.cgi?id=665704
https://bugzilla.mozilla.org/show_bug.cgi?id=656164
我正在尝试开发一种解决方法(因为Gmail可以做到),但我能想到的唯一解决方法似乎非常hackish。
一种判断是否拖动超出窗口的方式是等待 dragover
事件停止触发(因为 dragover
在整个拖放操作期间会一直触发)。这是我的做法:
var timeout;
function dragleaveFunctionality() {
// do stuff
}
function firefoxTimeoutHack() {
clearTimeout(timeout);
timeout = setTimeout(dragleaveFunctionality, 200);
}
$(document).on('dragover', firefoxTimeoutHack);
这段代码本质上是反复创建和清除一个超时计时器。除非 dragover
事件停止触发,否则不会达到200毫秒的超时时间。
虽然这样做有效,但我不喜欢使用超时计时器来实现这个目的。感觉不太对。这也意味着在“放置区域”样式消失之前会有轻微的延迟。
我想到的另一个方法是检测鼠标离开窗口的时间,但在拖放操作期间,常规方法似乎无法实现。
是否有其他更好的方法可以实现这一点呢?
更新:
这是我正在使用的代码:
$(function() {
var counter = 0;
$(document).on('dragenter', function(e) {
counter += 1;
console.log(counter, e.target);
});
$(document).on('dragleave', function(e) {
counter -= 1;
console.log(counter, e.target);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Open up the console and look at what number is reporting when dragging files in and out of the window. The number should always be 0 when leaving the window, but in Firefox it's not.</p>
bind()
和on()
之类的因素与此无关。 - Philip Waltonbind()
与on()
只是为了抓住任何可能的最后一根救命稻草-你永远不知道…… - Eli Sand