然后尝试使用其他键盘事件。例如,我刚刚添加
$("input").on('keyup', function() {
alert('keyup' + $(this).val());
})
对于您的 JSFiddle 示例,在文本框中alert
按下后会出现。a
number
注意:检查$(this).val()
不会返回无效字符(至少在 Chrome 中)。它在返回结果之前去除无效值(例如,1a
变为空白)。这也是为什么当change
事件的值实际上没有改变时事件似乎没有被触发,因为输入都是无效的。要捕获无效字符,您必须改为检查事件的keyCode
:
$("input").on('keyup', function(e) {
if (e.keyCode < 48 || e.keyCode > 57) {
// not 0-9 (note: ignores -)
alert('error!');
}
});
在搞砸了一点之后,我注意到 Chrome 和 IE10 的行为相似,但 IE10 的剥离似乎有一个错误:
如果您number
以非数字开始输入,那么 IE10(也可能是 9)将认为输入的其余部分是有效数字,无论后面跟着什么字符(例如,在 IE 眼中1a2
一样有效) 12
. 但是,在 Chrome 中,如果你输入了一个非数字,那么它会立即忽略该输入并声明它是无效的;在 IE10 中,如果以非数字开头,则行为相同。
行为上的一大区别是 IE10 将在 之后清除无效的数字字段blur
,但同样,如果该字段以非数字开头(例如,a1
),他们才会认为它无效。 -
可以在数字之前,但不能超过其中一个。
在这两种浏览器中,如果number
被认为是无效的,那么this.value
(因此$(this).val()
)将返回空白。number
在 IE10 中,如果以数字 ( ) 开头,您可以获得原始的无效值0-9
。两个浏览器只会change
在它们认为输入实际发生变化时触发事件,并且在 IE10 的情况下,这意味着如果用户输入abcd
然后blur
输入,那么 IE10 将清除该字段并在它有一个有效的情况下触发一个change
事件更改前的值。在 Chrome 中,无论输入是否有效,都会发生变化;如果它无效,则将其更改为空白值。
这意味着您可以处理有效和无效的数字输入,但您无法可靠地获取用户在文本框中键入的实际值。
HTML
put letters in me and press tab:
<br />
<input type="number"/>
<br />
<p id="event" />
<p id="text" />
JavaScript
function checkValid(e) {
var $this = $(this);
$("#event").text(e.type);
$("#text").html("this.value: " +
this.value +
"<br />$(this).val(): " +
$this.val() + "<br />$(this).is(:valid): " +
$this.is(":valid") +
"<br />$.isNumeric(this.value): " +
$.isNumeric(this.value)); // <- helps check
}
$('input[type="number"]').on('change', checkValid).on("keyup", checkValid);
您可以通过检查来检查它是否是有效数字$.isNumeric
。和伪类在 IE10 中不起作用,:valid
除非该字段被标记为(在 IE9 中根本没有),但它们都在 Chrome 中起作用而没有将其标记为.:invalid
number
required
required