我正在编写一些jQuery,它拦截输入字段中输入的值,并确定是允许还是阻止输入值。
我需要获取下一个值,即,我要允许按键的值是什么,我需要在显示之前的某个点知道这个值,所以我正在使用keypress
事件。
我的问题是:在keypress
事件中,我如何判断我允许按键的结果值是什么?什么是' 潜在价值'?
如果我将按键事件对象写入控制台并检查属性,我可以看到currentTarget.value
显示了这个潜在价值'。但是,如果我在keypress
事件中使用此属性,则它仅返回上下文按键之前的值。
例如,如果用户键入" a"到一个绑定到以下jQuery的空文本框
$(":input").on("keypress", function(e) {
console.log(e);
console.log(e.currentTarget.value);
});
向下挖掘第一个控制台输出(e
)会显示currentTarget.value
=" a"。
但第二个控制台输出(e.currentTarget.value
)将显示""。
如果用户输入" b"然后进入同一个文本框:
手动检查e
并找到currentTarget.value
显示" ab&#34 ;;从事件内部转储e.currentTarget.value
会显示" a"。
任何人都可以解释我如何才能获得这个' 潜在价值'在keypress
事件中?
答案 0 :(得分:3)
不是最漂亮的解决方案(你可以看到它会在它被还原之前得到结果),但为了省去在箭头/控件和输入键等之间辨别的麻烦,你可以将原始值存储在keypress
中并在需要时恢复到keyup
中的那个(也存储选择位置以进行完全回复)
$(":input").keypress(function(e) {
$(this).data('orgValue', {value: this.value, pos: this.selectionStart, selend:this.selectionEnd});
}).keyup(function(e){
var val = this.value;
if(!somevalidation(val)){
var org =$(this).data('orgValue');
this.value = org.value;
this.selectionStart = org.pos;
this.selectionEnd = org.selend;
}
});
示例fiddle
修改强>
做了一些测试,但是jquery使预测结果相对容易。它不仅填充了键属性,还填充了可以检查键类型的事件的其他属性。虽然对于'非输入'键,测试charCode似乎为0。 直截了当的是:
$(":input").keypress(function(e) {
if(!e.charCode)return; //is 0 for non input
var cur = this.value; //current value
var val = cur.substring(0,this.selectionStart)
+ e.key
+ cur.substring(this.selectionEnd);
return cur=== val //unchanged
|| somevalidation(val);
});
但是这也不包括删除/退格,以便处理这些:
$(":input").keypress(function(e) {
var key,start = this.selectionStart ,end = this.selectionEnd;
if(e.charCode)
key = e.key;
else{
if(e.keyCode===8 || e.keyCode===46){
key = '';
if(end===start){
if(e.keyCode===8)
start--;
else
end++;
}
}
else
return true; //charCode is 0 for non input 46 = delete 8 = backspace
}
var cur = this.value; //current value
var val = cur.substring(0, start) + key + cur.substring(end);
return cur=== val //unchanged
|| somevalidation(val);
});
虽然测试它看起来像预期的那样。另一种方式可能是隐藏输入字段,在那里发送密钥并检查其结果,但上面应该可以解决问题。