我有一个表单字段,我需要能够检测字段何时更改并使用字段的 new 值执行一些其他代码。如果按下的键实际上改变了文本框的值,我只想执行代码。这是我提出的解决方案。
function onkeypress(e) {
var value = this.value;
// do something with
}
function onkeyup(e) {
if ( e.which == 8 || e.keyCode == 46 ) { // delete or backspace keys
this.onkeypress(e);
}
}
但是只有一个问题。 onkeypress在字段值更新之前被触发,所以当我获取值时,我得到之前的值。如果我知道一种方法来测试密钥是否改变了值,我会专门使用密钥,但是某些字符(如箭头键)对字段的值没有影响。
有什么想法吗?
答案 0 :(得分:4)
这很简单,只需使用onkeyup而不是onkeypress
答案 1 :(得分:3)
我这样做的方法只是使用prevValue
行的变量。在按键功能结束时,将值存储在该变量中,如果该值不等于之前的值,则仅再次执行该功能。
答案 2 :(得分:1)
有另一个条件:
if(e.keyCode > 31 && e.keyCode < 127) {
value = this.value + e;
}
这将捕获键盘在特殊字符范围之外输入的任何低级ascii符号。
编辑:(32是空格)
function onkeyup(e) {
if ( e.which == 8 || e.keyCode == 46 ) { // delete or backspace keys
switch(e.keyCode) {
case 32:
case 48..90:
case 96..111:
case 188:
case 190..192:
case 219..222:
value = this.value + e;
break;
default:
break;
}
this.onkeypress(e);
}
}
答案 3 :(得分:1)
这是我的最终解决方案,它使用prevValue变量,但不会污染全局命名空间(窗口)或dom元素的属性。
(function() {
var input = document.getElementById('input_box'),
prevValue;
input.onkeyup = function(e) {
if ( this.value != prevValue ) {
prevValue = this.value;
// execute some more code here...
}
}
}());
请注意,onkeyup函数用作prevValue变量的闭包。这可以防止命名空间污染,因此我不必创建全局变量或将属性附加到input元素本身。这是我能得到的优雅。我实际上是用jQuery编写的,但认为答案本身应该是纯JavaScript ......
答案 4 :(得分:0)
这是一种黑客行为,但您可以将之前的值放在文本框的属性中(称为“expando attributes”)
function onkeypress(e) {
this.oldvalue = this.value;
}
function onkeyup(e) {
if (this.value != this.oldvalue) {
// do something
}
}
答案 5 :(得分:0)
您可以存储旧值并检测它是否发生了变化:
function keyUpHandle(e) {
if (this.prevValue && this.prevValue != this.value) {
// do something
}
this.prevValue = this.value;
}