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;

в обработчик.

Другие вопросы по тегам