Это не обязательно поможет с вашей реальной проблемой XHR, но я думаю, что понимаю, что происходит. Я расширил ваш пример кода, используя для удобства jQuery:
<div class=parent>Label: <input class=field></div>
и JavaScript:
var $d = $(document);
var t = {
mousedown: -1,
mouseup: -1,
focus: -1,
click: -1,
blur: -1,
timer: -1
};
["mousedown", "mouseup", "focus", "click"].forEach(function(event) {
$d.on(event, ".parent", function() {
t[event] = Date.now();
})
});
$d.on("blur", ".field", function() {
t.blur = Date.now();
setTimeout(function() {
t.timer = Date.now();
}, 150);
});
$d.on("click", ".parent", function() {
setTimeout(function() {
var race = Object.keys(t).sort(function(k1, k2) { return t[k1] - t[k2];});
console.log("Result: ", race);
race.forEach(function(key) { t[key] = -1; });
}, 1000);
});
Что делает этот код, так это упорядочивает события по времени, когда они действительно происходят. В случае щелчка по тексту после щелчка и фокусировки в поле ввода, порядок с коротким тайм-аутом (менее 100 мс или около того) составляет
- внимание
- MouseDown
- Размытие
- Таймер
- MouseUp
- нажмите
События «размытия» и «таймера» предназначены для поля ввода и его обратного вызова setTimeout()
. Если я увеличу интервал ожидания, например, 150 мс или около того, я получу
- внимание
- MouseDown
- Размытие
- MouseUp
- нажмите
- Таймер
Это, я думаю, имеет некоторый смысл: события "mousedown" и "mouseup" обусловлены вашим фактическим физическим взаимодействием с кнопкой мыши. Событие «click» не имеет смысла, пока не будет получено «mouseup». С коротким таймером в обработчике «размытия» таймер может сработать до того, как мышь физически сообщит о событии «вверх» через вашу ОС и т. Д.