HTML输入类型号JavaScript onchange触发两次?

HTML输入类型号JavaScript onchange触发两次?,javascript,forms,html,javascript-events,Javascript,Forms,Html,Javascript Events,我不敢相信我已经找不到任何关于这个的讨论了。。。如何处理来自HTML5表单元素的事件一直是个问题。。。但是没有其他人注意到这一点吗 当我使用箭头键从空白变为数字时,onchange事件会发生两次。似乎在瞬间变为0,然后变为1。我使用的是Chrome 23.0.1271.64 m。没有尝试过其他浏览器 是虫子吗?预期?不同浏览器之间的相似性?更好的问题是,避免这种行为的最佳方法是什么?我正在进行一些即时验证,由于0无效,我的友好“You can't do that”文本会在再次离开之前出现一个闪光

我不敢相信我已经找不到任何关于这个的讨论了。。。如何处理来自HTML5表单元素的事件一直是个问题。。。但是没有其他人注意到这一点吗

当我使用箭头键从空白变为数字时,
onchange
事件会发生两次。似乎在瞬间变为0,然后变为1。我使用的是Chrome 23.0.1271.64 m。没有尝试过其他浏览器

是虫子吗?预期?不同浏览器之间的相似性?更好的问题是,避免这种行为的最佳方法是什么?我正在进行一些即时验证,由于0无效,我的友好“You can't do that”文本会在再次离开之前出现一个闪光。在上面链接的问题中,有人建议使用“oninput”事件,但在如何跨浏览器工作方面存在一些分歧

我想最好的办法是完全忘记数字类型,因为它本身还没有完全得到支持。我很想知道其他人是否也明白这一点,以及他们是如何处理的。

我复制了它

如果输入开始时为空。第一次按下向上或向下按钮时,将其设置为
0
,然后将其设置为
1
-1

这不是一个bug

这对你来说很方便!它不必从0开始,它可以从1000000000000000开始,但它没有:-)



如果输入不以空白开始,那么您就没有任何问题。

这确实是一个好的观点

但首先:避免这种情况的方法

将焦点处理程序设置为onfocus并保存该值。如果值已更改,则在blur上设置模糊处理程序将当前值与保存的值进行比较触发/分派/触发“comittedchange”事件。->使用CommittedChange事件而不是busted change事件:-)

以下是一些想法。但首先要阅读HTML5规范中的

现在了解一些历史

HTML4规范有一个不同的定义(如果值/checkednes发生了变化,元素被激活或未聚焦,则会发生事件),这是一件坏事,尤其是对于复选框和单选按钮(这就是为什么人们对这些元素(或jQuery)使用click而不是change事件)

新的HTML5规范

新规范结合了第一个定义,并添加了一些额外的称为“显式提交操作”。实际上,我并不真正理解这意味着什么,但我确信,当用户在旋转按钮(type=number)上按下鼠标时,该用户还没有执行提交操作,他仍然在与表单交互,并且仍然可能执行输入/更改

此外,HTML5还添加了输入事件,以“更快”通知开发人员一些非最终更改。例如,将其与datalist元素结合,并允许动态更改,即创建自动建议

现实:浏览器

如果输入类型带有旋转按钮(类型编号、时间等)。Opera和Chrome的行为非常相似(与spinbutton交互会触发输入和更改),Safari则会触发模糊更改。在type=range的情况下,所有浏览器都处理相同的类型。拖动鼠标时,始终会触发更改事件和输入事件。好吧,我们有两个不同的事件,它们具有不同的规范和用例,但实际上它们在做相同的事情(是的)

现实:开发者

现在有很多教程和脚本使用用例的type=range的change事件,它们应该使用输入事件,但是您知道,开发人员很愚蠢,只阅读了1%的规范

故事结束

旧的定义是不好的,使它毫无用处。新的规范得到了改进,但不可理解,被误用,实现不好。。。现在呢???我认为没有人想打破旧的糟糕的HTML5教程/脚本代码


如果你想改变这一点。

好的。我只是不明白为什么它不能从空白变为1或者从空白变为-1。它似乎更直观;你按下按钮一次,它就会改变一次。另外,为了科学起见,你使用了什么浏览器?
Chrome 23.0.1271.64 m
@Andrew