1

我不敢相信我已经找不到任何关于此的讨论......关于如何处理来自 HTML5 表单元素的事件的问题<input type="number"/>......到目前为止,似乎存在很多浏览器不一致。但是没有其他人注意到这一点吗?

onchange当我使用箭头键从空白变为数字时,该事件发生了两次。自己试试。似乎立即变为 0,然后变为 1。我使用的是 Chrome 23.0.1271.64 m。其他浏览器没试过。

它是一个错误吗?预期的?跨浏览器类似吗?一个更好的问题是,避免这种行为的最佳方法是什么?我正在进行一些即时验证工作,并且 0 无效,我友好的“你不能那样做”文本会在再次消失之前出现一闪而过。在上面链接的问题中,建议使用“oninput”事件,但对于它如何跨浏览器工作存在一些分歧。

我想最好的方法是完全忘记数字类型,因为它本身还没有完全支持。我有兴趣看看其他人是否得到了这个,以及他们如何处理它。

4

2 回答 2

2

我复制了它。

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

这不是错误。

为您提供方便!它不必从 0 开始,它可以从 100000000000000000 开始,但它没有:-)


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

于 2012-11-13T15:02:01.603 回答
1

这确实是一个好点。

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

设置焦点处理程序 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 教程/脚本代码。

如果你想改变这一点,请成为我的英雄

于 2012-11-13T23:17:41.247 回答