【发布时间】:2012-05-02 11:28:09
【问题描述】:
在窗口外拖动时,Firefox 没有正确触发 dragleave 事件:
https://bugzilla.mozilla.org/show_bug.cgi?id=665704
https://bugzilla.mozilla.org/show_bug.cgi?id=656164
我正在尝试为此开发一种解决方法(我知道这是可能的,因为 Gmail 正在这样做),但我唯一能想到的似乎真的很老套。
知道何时在窗口外拖动的一种方法是等待dragover 事件停止触发(因为dragover 在拖放操作期间不断触发)。以下是我的做法:
var timeout;
function dragleaveFunctionality() {
// do stuff
}
function firefoxTimeoutHack() {
clearTimeout(timeout);
timeout = setTimeout(dragleaveFunctionality, 200);
}
$(document).on('dragover', firefoxTimeoutHack);
这段代码本质上是一次又一次地创建和清除超时。除非dragover 事件停止触发,否则不会达到 200 毫秒超时。
虽然这可行,但我不喜欢为此目的使用超时的想法。感觉不对。这也意味着在“dropzone”样式消失之前会有一点延迟。
我的另一个想法是检测鼠标何时离开窗口,但执行此操作的正常方法在拖放操作期间似乎不起作用。
有没有人有更好的方法来做到这一点?
更新:
这是我正在使用的代码:
$(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>
【问题讨论】:
-
问题在 Firefox 11 中似乎已修复 - 您的目标是什么版本?
-
我仍然在 Firefox 11 上看到它,根据错误报告,它尚未修复。我会看看我是否可以制作一个演示链接。
-
请 - 这可能有助于查明问题。我制作了一个简单的页面并绑定到文档上的拖动,当我拖动离开文档时它为我触发。我还发现 this... 有趣的是,某些绑定了事件的事件会影响其他事件的触发
-
我看到的是处理程序在进入时触发两次,在离开时触发一次。我不知道我是否有同样的问题。火狐 11.0。
-
如果您在安全模式下启动 Firefox(无插件)会怎样?我刚刚按原样尝试了您的演示页面,进入时得到 1,退出时得到 0。
标签: javascript jquery html drag-and-drop