JavaScript обработчик событий Race
Если у меня есть текстовое поле с зарегистрированным onblur
обработчик событий и кнопка с зарегистрированным onmouseup
обработчик событий, какая из этих двух функций будет запускаться раньше и почему?
Чтобы сделать мой вопрос более понятным, давайте предположим, что в настоящее время фокус находится на текстовом поле, и я хочу нажать на кнопку.
Будет ли какая-то разница между различными интернет-браузерами?
редактировать
Особенно хитрым кажется onmousedown
событие, когда он зарегистрирован с помощью кнопки, в то время как текстовое поле имеет onblur
событие зарегистрировано с ним.
2 ответа
Спецификация говорит blur
должен быть запущен, когда фокус покидает элемент (после удаления фокуса), но я не вижу какого-либо явного утверждения о том, когда это должно произойти относительно события, вызывающего смещение фокуса.
Конечно mouseup
произойдет намного позже (в компьютерном плане), так как сначала вы должны mousedown
,
Я бы ожидал blur
стрелять до того, как mousedown
, но я бы ошибался: согласно экспериментам, mouseup
после, но mousedown
это раньше. Я проверил это, используя Chrome 26, Opera 12.15, Firefox 20, IE8 и IE9 - и если вы сможете заставить этих пятерых договориться о поведении, это, вероятно, будет последовательным в других...:-) Я подозреваю, что это потому что если вы предотвратите действие по умолчанию mousedown
, фокус никогда не удаляется от текстового поля: Пример. (Это поведение одинаково для четырех из этих пяти браузеров, поскольку IE8 не препятствует изменению фокуса - это означает, что IE7 и 6, вероятно, тоже этого не делают.) Так что, хотя это кажется странным, оно имеет смысл.
Как всегда, протестируйте браузеры, которые вы намереваетесь поддерживать.
Просто сохраните отметку времени при запуске
var start = new Date().getTime();
а потом
var elapsed = new Date().getTime() - start;
в обработчик.