Подтвердить что ты не робот

Гарантируется ли событие blur() перед фокусом(), когда вы фокусируетесь на новом элементе?

Скажем, у меня есть два поля ввода.
У меня есть фокус, затем я нажимаю на другое поле ввода.

Является ли гарантированным, что событие blur() (первого элемента, потерявшего фокус) происходит до события focus() (другой элемент получил фокус)?

4b9b3361

Ответ 1

На W3C проекта DOM3 События, спецификация говорит вам:

Заказ события фокуса

События фокусировки, определенные в этой спецификации, происходят в заданном порядке относительно друг друга. Ниже приведена типичная последовательность события, когда фокус смещается между элементами (этот порядок предполагает что ни один элемент изначально не сфокусирован):

> User shifts focus
> 1.    focusin Sent before first target element receives focus
> 2.    focus   Sent after first target element receives focus 
> User shifts focus
> 3.    focusout    Sent before first target element loses focus
> 4.    focusin Sent before second target element receives focus
> 5.    blur    Sent after first target element loses focus
> 6.    focus   Sent after second target element receives focus

Обратите внимание, что утверждение, что не может быть двух элементов с фокусом, не совсем корректно; хотя я не знаю настольных сред, которые позволяют двум виджетам сфокусироваться одновременно, спецификация позволяет реализации решить, что:

Другие спецификации могут определять более сложную модель фокусировки, чем описано в этой спецификации, включая возможность использования нескольких элементов для текущего фокуса.

Также это стоит упомянуть:

Язык хоста может определить конкретные элементы, которые могут получать фокус, условия, при которых элемент может получать фокус, средства, с помощью которых основное внимание может и порядок изменения фокуса. (курсив мой).

Однако будьте осторожны, что Chrome не соответствует стандарту - вместо этого порядок blur, focusout, focus, focusin. Вы можете проверить это, используя эту страницу. У браузеров Webkit может быть такая же проблема. focusin и focusout события поддерживаются так Firefox 52.

Ответ 2

Я бы сказал, да. В противном случае два элемента могли бы сфокусироваться одновременно, что никогда не должно быть возможным.