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);
Этот код по существу создает и очищает тайм-аут снова и снова. Таймаут в 200 миллисекунд не будет достигнут, если событие dragover
не прекратит стрельбу.
Пока это работает, мне не нравится идея использовать таймаут для этой цели. Он чувствует себя не так. Это также означает небольшое отставание до того, как стилизация "dropzone" исчезнет.
Другая идея, которую я имел, - обнаружить, когда мышь покидает окно, но обычные способы сделать это не работают во время операций перетаскивания.
Есть ли у кого-нибудь лучший способ сделать это?
UPDATE:
Вот код, который я использую:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Drag and Drop Issue</title>
<script src="http://code.jquery.com/jquery.js"></script>
</head>
<body>
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 not.
<script type="text/javascript">
$(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>
</body>
</html>