在将焦点赋予新元素时,是否可以保证blur()事件发生在focus()之前?

假设我有两个输入字段。
一个人有焦点,然后我点击另一个输入字段。

是否保证 blur()事件(失去焦点的第一个元素)发生 focus()事件之前(其他元素得到焦点)?

从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浏览器可能有同样的问题。 自Firefox 52以来,支持focusinfocusout事件。

我会说是的。 否则,两个元素可能同时具有焦点,这是永远不可能的。