如何在jQuery的keypress事件中获得全部价值?

时间:2015-11-08 09:36:57

标签: javascript jquery keypress jquery-events

我正在编写一些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事件中?

1 个答案:

答案 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);        
});

Fiddle

虽然测试它看起来像预期的那样。另一种方式可能是隐藏输入字段,在那里发送密钥并检查其结果,但上面应该可以解决问题。