在onchange事件之前开火onblur事件

Joe*_*oel 6 html javascript jquery dom javascript-events

我有一个包含多个文本输入字段的大表单.从本质上讲,我需要处理onchange事件的所有字段onblur事件的一些领域.当对字段进行更改并且字段失去焦点时,两个事件都会触发(这是正确的行为).唯一的问题是我想在处理onblur 事件之前处理onchange事件.

在ie和Firefox中进行一些测试之后,似乎默认行为是在onchange之前触发事件onblur.我一直在使用以下代码作为测试...

<html>

<body >
    <input type="text" value="here is a text field" onchange="console.log('Change Event!')" onblur="console.log('Blur Event!')" >

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

这让我想到了我的问题:

  1. 似乎这种行为在浏览器中是一致的.为什么onchange先开火?

  2. 由于我无法处理onblur每个输入元素的事件,有没有办法onblur在处理onchange事件之前触发?

ale*_*xsh 8

  1. 首先onchange触发的原因是,一旦元素失去焦点(即'模糊'),变化通常就完成了(我说通常是因为脚本仍然可以在没有用户交互的情况下更改元素).

  2. 对于那些onblur首先需要处理的元素,您可以禁用onchange处理程序并onchangeonblur处理程序中激活(甚至是自定义事件).这将确保正确的订单,即使它是更多的工作.要检测更改,可以为该字段使用状态变量.

但是,作为一般性评论,对这种同步性的需求表明,即使有时无法避免,您用于解决您正在解决的任何问题的方法可能还需要更多的工作.如果您确定这是唯一的方法,请尝试以下方法之一!

编辑:只是要详细说明最后一点,你必须遵循一些关于你的事件模型的假设.您是否假设每个change事件后跟一个blur并且未经过处理,或者您是否愿意处理每个事件,change而不是那些随后进行blur进一步处理的事件onblur?在任何情况下,如果您想强制执行订单,处理程序将需要访问公共资源(全局变量,属性等).您可能想要使用其他事件类型吗?(input?).最后,此链接提供了有关changeMozilla浏览器事件的一些详细信息:https: //developer.mozilla.org/en-US/docs/Web/Reference/Events/change.第三个"子弹"解决了事件顺序问题.