这确实是一个好点。
但首先:避免这种情况的方法
设置焦点处理程序 onfocus 保存值。设置模糊处理程序 onblur 比较当前值与保存的值,如果值已更改触发/调度/触发“comittedchange”事件。-> 使用 commitedchange 事件而不是 busted 更改事件 :-)
这里有一些想法。但首先阅读更改事件的 HTML5 规范。
现在有些历史
HTML4 规范有不同的定义(如果 value/checkednes 发生变化并且元素被激活或未聚焦事件发生),这是一件坏事,尤其是对于复选框和单选按钮(这就是人们使用 click 而不是这些元素(或 jQuery)的更改事件)。
新的 HTML5 规范
新规范结合了第一个定义并添加了一些额外的称为“显式提交操作”。实际上我并不真正理解这意味着什么,但我敢肯定,当用户在旋转按钮(类型=数字)上按下鼠标时,该用户尚未执行提交操作,他仍在与表单交互并且仍然可能会进行输入/更改。
此外,HTML5 添加了输入事件,以“更快地”通知开发人员一些非最终更改。例如,将其与 datalist 元素结合并允许动态更改,即创建自动建议。
现实:浏览器
如果输入类型带有微调按钮(类型编号、时间等)。Opera 和 Chrome 的行为非常相似(与微调按钮交互触发输入和更改),Safari 触发更改 onblur。在 type=range 的情况下,所有浏览器都在处理它。change 事件和 input 事件一直触发,同时拖动鼠标。很好,我们有两个不同的事件,具有不同的规范和用例,但它们在现实中做同样的事情(是的)。
现实:开发商
好吧,有很多教程和脚本在用例中使用 type=range 的 change 事件,它应该接受 input 事件,但是如您所知,开发人员很愚蠢,只阅读了规范的 1%。
故事结局
旧的定义很糟糕,使它毫无用处。新规范得到了改进,但无法理解,被误用并且实施不当......现在?我认为没有人想打破旧的糟糕的 HTML5 教程/脚本代码。
如果你想改变这一点,请成为我的英雄。