为什么我的 jQuery 中允许退格键,无论我是否过滤掉它?
Why is backspace allowed in my jQuery whether I filter it out or not?
我知道了 jQuery:
$(document).on("keypress", '[id*=Float]', function (e) {
//only allow 1..9 (48..57), '.' (46), and backspace (8)
var k = e.which;
if (k === 8 || k === 46) return;
if (k < 48 || k > 57) { e.preventDefault(); }
});
...致力于此 HTML:
<input type="text" id="txtbxFloat">
</br>
<input type="text" id="txtbxHopeFloats">
</br>
<input type="text" id="txtbxFloatingFreeAsABird">
可以摆弄here
它做了评论 say/what 我想要的。但是,这样做也是如此:
$(document).on("keypress", '[id*=Float]', function (e) {
//only allow 1..9 (48..57), '.' (46), and backspace (8)
var k = e.which;
if (k === 46) return;
if (k < 48 || k > 57) { e.preventDefault(); }
});
IOW,在任何一种情况下都允许使用“8”(退格键)。为什么?我想目前这对我来说不是问题,但如果我真的想要防止退格怎么办?
如果你真的想防止退格,你应该取消绑定默认事件并重新附加它的 'new' 版本。
试试这样的:
$(document).unbind('keydown').bind('keydown', function (event) {
var doPrevent = false;
if (event.keyCode === 8) {
var d = event.srcElement || event.target;
if ((d.tagName.toUpperCase() === 'INPUT' && (d.type.toUpperCase() === 'TEXT' || d.type.toUpperCase() === 'PASSWORD' || d.type.toUpperCase() === 'FILE')) || d.tagName.toUpperCase() === 'TEXTAREA') {
doPrevent = d.readOnly || d.disabled;
}
else {
doPrevent = true;
}
}
if (doPrevent) {
event.preventDefault();
}
// rest of code here
});
我认为解决方案是使用 keydown
而不是 keypress
。
键盘事件按以下顺序发生:keydown
、keyup
、keypress
。
$(document).on("keydown", '[id*=Float]', function (e) {
//only allow 1..9 (48..57), '.' (46), and backspace (8)
var k = e.which;
if (k === 46) return;
if (k < 48 || k > 57) { e.preventDefault(); }
});
我认为 keypress
在使用退格键时不会触发,因为 keypress
在输入实际字符(任何打印键)时触发。退格键不输入任何字符。如果按下任何键, keydown
就会触发。这就是 keydown
应该防止退格的原因。
这就是Jquery spec
中提到的
当浏览器注册键盘输入时,keypress 事件被发送到一个元素。这类似于 keydown 事件,除了修饰键和非打印键 (例如 Shift、Esc 和 delete)会触发 keydown 事件,但不会触发按键事件。**这两个事件之间的其他差异可能会出现,具体取决于平台和浏览器。
我知道了 jQuery:
$(document).on("keypress", '[id*=Float]', function (e) {
//only allow 1..9 (48..57), '.' (46), and backspace (8)
var k = e.which;
if (k === 8 || k === 46) return;
if (k < 48 || k > 57) { e.preventDefault(); }
});
...致力于此 HTML:
<input type="text" id="txtbxFloat">
</br>
<input type="text" id="txtbxHopeFloats">
</br>
<input type="text" id="txtbxFloatingFreeAsABird">
可以摆弄here
它做了评论 say/what 我想要的。但是,这样做也是如此:
$(document).on("keypress", '[id*=Float]', function (e) {
//only allow 1..9 (48..57), '.' (46), and backspace (8)
var k = e.which;
if (k === 46) return;
if (k < 48 || k > 57) { e.preventDefault(); }
});
IOW,在任何一种情况下都允许使用“8”(退格键)。为什么?我想目前这对我来说不是问题,但如果我真的想要防止退格怎么办?
如果你真的想防止退格,你应该取消绑定默认事件并重新附加它的 'new' 版本。
试试这样的:
$(document).unbind('keydown').bind('keydown', function (event) {
var doPrevent = false;
if (event.keyCode === 8) {
var d = event.srcElement || event.target;
if ((d.tagName.toUpperCase() === 'INPUT' && (d.type.toUpperCase() === 'TEXT' || d.type.toUpperCase() === 'PASSWORD' || d.type.toUpperCase() === 'FILE')) || d.tagName.toUpperCase() === 'TEXTAREA') {
doPrevent = d.readOnly || d.disabled;
}
else {
doPrevent = true;
}
}
if (doPrevent) {
event.preventDefault();
}
// rest of code here
});
我认为解决方案是使用 keydown
而不是 keypress
。
键盘事件按以下顺序发生:keydown
、keyup
、keypress
。
$(document).on("keydown", '[id*=Float]', function (e) {
//only allow 1..9 (48..57), '.' (46), and backspace (8)
var k = e.which;
if (k === 46) return;
if (k < 48 || k > 57) { e.preventDefault(); }
});
我认为 keypress
在使用退格键时不会触发,因为 keypress
在输入实际字符(任何打印键)时触发。退格键不输入任何字符。如果按下任何键, keydown
就会触发。这就是 keydown
应该防止退格的原因。
这就是Jquery spec
中提到的当浏览器注册键盘输入时,keypress 事件被发送到一个元素。这类似于 keydown 事件,除了修饰键和非打印键 (例如 Shift、Esc 和 delete)会触发 keydown 事件,但不会触发按键事件。**这两个事件之间的其他差异可能会出现,具体取决于平台和浏览器。