Jquery Keypress + .val()问题

时间:2011-07-11 11:18:01

标签: javascript jquery

我试图通过将函数绑定到keypress事件来对某些字段执行验证。

我制作了几个自定义验证对象并将它们放在数组验证中(完整代码未显示):

    {"id": "DE-mname", "events":"keypress", "func": function(obj){
        return validator.name($(obj).val()) || $(obj).isEmpty();
    }

并使用以下方法和自定义jquery插件将其附加到某些组件:

DataEntry.prototype.attachValidators = function(){
        var x, validation;
        for(x in this.validations)
        {
            validation = this.validations[x];
            $("#" + validation.id).attachValidation(validation.events,validation.func); 
        }
};

/**
 *
 * @param {String} Events - a string of events you want validation to execute on
 * should be delimited by a space.
 * @param (Function) validateFunc - a function used to determine if the field is valid,
 * must return true, truthy, false or falsey values, the function may accept an object
 * as the first parameter which will be the selected jquery object.
 */
(function($){
    $.fn.extend({
        attachValidation: function(events, validateFunc){
            events += " validate";
            return this.each(function(){
                var that = this;
                $(this).bind(events, function(event){
                    if (validateFunc(that, event)) {
                        $(that).removeClass("error");
                    }
                    else {
                        $(that).addClass("error");
                    }
                    jq(this).trigger("errorAttached");
                });
            });
        }
    });
})(jQuery

我遇到的问题是,当触发按键事件并且验证函数检查文本框组件的.val()时,新值不包含正在按下的当前键。

例如:如果我点击输入字段并点击'$'键,$(obj).val())将返回一个空字符串,而不是$。我想用当前按下的键检索值。 请注意,我无法切换到关键字事件

4 个答案:

答案 0 :(得分:2)

您可以检查事件的几个不同属性,以查看按下了哪些键:

然后,您可以将该信息与当前值组合以确定新值。当您需要处理{kbd>删除, Backspace 删除 Ctrl keypress事件时,它会变得复杂 - C Ctrl - V

通常,如果您切换到使用keyup,您的任务将 更容易。我知道你说你做不到,但我只是把它放在那里。

另一点:没有jQuery .isEmpty()方法,就像你的代码一样。

答案 1 :(得分:1)

尝试使用charCode转换来获取按下的按钮

String.fromCharCode(e.which)

看看小提琴

http://jsfiddle.net/5ASA9/3/

您无法直接检查输入的值,因为此事件发生在之前字段值。

答案 2 :(得分:1)

keypress事件可能是用于验证此类型的不良选择,因为它发生在目标对象的更改事件之前(在本例中为文本框)。您可以捕获正在输入的关键字符,但由于文本框值尚未更改,因此您无法验证新值。也许keyup对你来说是更好的选择。你说哪个不能用,为什么?什么阻止你使用这个事件?

答案 3 :(得分:0)

使用HTML5 input事件。请参阅this answer