Пожалуйста, не действия с огнем щелчка во время события mousedown
.Он игнорирует остальную часть конвейера событий и идет вразрез с текущими ожиданиями пользователей и методами проектирования.
Проблема
Вот взгляд на нормальный порядок событий, которые запускаются для каждого типа клика:
$(document).on("mousedown mouseup click focus blur",function(e) {
console.log("{" + e.which + ":" + e.type + "}");
});
Как правило, мы обрабатываем самое последнее click
событие, поскольку оно означает конечное намерение пользователя перейти к текущемуaction.
Событие click
наступает, когда кнопка указывающего устройства ( обычно основная кнопка мыши ) нажата и отпущена на single element .
К сожалению, средние нажатия мыши не запускают такое событие (возможно потому, что это заставит разработчиков, слушающих событие click, различать несколько возможных вызовов).Но если мы хотим подключить действия к среднему щелчку, мы должны следовать тем же ожиданиям UX.
Решение
Мы будем слушать mousedown
события и немедленно прикреплять вовремя использованияобработчик для mouseup
событий.Если была нажата средняя клавиша и если элементы совпадают, мы запустим наше собственное пользовательское событие с типом middleclick
, которое мы начнем с исходного события.
$(document).on("mousedown", function (e1) {
$(document).one("mouseup", function (e2) {
if (e1.which == 2 && e1.target == e2.target) {
var e3 = $.event.fix(e2);
e3.type = "middleclick";
$(e2.target).trigger(e3)
}
});
});
Это поможет отделить определение , если средняя кнопка была нажата с тем, как мы хотим ее обработать в этом случае, поэтому мы можем настроить слушателядля нашего пользовательского типа события, такого как:
$(document).on("middleclick", function (e) {
console.log("{" + e.target.nodeName.toLowerCase() + ":" + e.type + "}");
});
Рабочая демонстрация в jsFiddle и фрагменты стека:
$(document).on("mousedown", function (e1) {
$(document).one("mouseup", function (e2) {
if (e1.which == 2 && e1.target == e2.target) {
var e3 = $.event.fix(e2);
e3.type = "middleclick";
$(e2.target).trigger(e3)
}
});
});
$(document).on("middleclick", function (e) {
console.log("{" + e.target.nodeName.toLowerCase() + ":" + e.type + "}");
});
$(document).on("mousedown mouseup click focus blur",function(e) {
console.log("{" + e.which + ":" + e.type + "}");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<div style="background:#31965a;color:white;width:100px;height:100px;line-height:100px;text-align:center;">
Click Me!
</div>
* Испытано в Chrome, FF, Edge и IE11