我有一个包含此输入字段的表单:
<input type="number" name="price" data-bind="price">
而这个敲除验证定义:
...
price = ko.observable().extend({required: true, number: true})
...
问题是,当我输入非数值时,浏览器实际上将type="number"
字段的值设置为空字符串(内部),因此模型接收空字符串。因此,即使用户在字段中看到值,挖空验证机制也始终触发"必需"验证。最好触发"请输入数字"消息,而不是"此字段为必填字段"消息。
我当然可以使用type="text"
但这会在移动设备上触发错误的键盘。有什么想法可以解决这个问题吗?
这当然与这个问题有关:如果 Webkit 中有空格或非数字字符,HTML5 输入类型=数字值为空?,但不幸的是,使用 type="tel" 对我来说不是一个选择。
这很尴尬,因为正如这个问题的答案所揭示的那样,浏览器不会公开HTML5数字输入的"原始"文本值,并且在无效和空输入的情况下返回一个空字符串作为元素值。因此,您无法可靠地区分非数字值和缺失值 - 这最终是错误消息所需要的。
您甚至无法嗅探按键并查看用户是否以这种方式输入无效字符,因为您不知道用户是否复制/粘贴无效内容。
过去,我曾编写过创建自定义绑定来创建文本输入并强制使用数字,但正如您承认的那样,这些绑定将具有限制,例如调出错误的移动键盘。
这很令人失望,但我想不出这个问题的解决方案。