【问题标题】:Jquery Keypress + .val() issuesJquery Keypress + .val() 问题
【发布时间】:2011-07-11 11:18:00
【问题描述】:

我正在尝试通过将函数绑定到按键事件来对某些字段执行验证。

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

    {"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

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

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

【问题讨论】:

  • 好的,正在切换到检查 Tab 键,在这工作之后,我有更艰巨的任务是找出谁应该为答案提供功劳

标签: javascript jquery


【解决方案1】:

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

然后,您可以将该信息与当前值结合起来确定新值。当您需要处理 keypress 事件时,它会变得复杂,例如 DeleteBackspaceDeleteCtrl-C、Ctrl-V

一般来说,如果您改用keyup,您的任务会轻松得多。我知道你说过你不能,但我只是把它放在那里。

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

【讨论】:

  • 我同意,但是当我使用 keyup 事件时,该字段会验证我是否选择它,从而导致它接收到使该字段变为红色的错误类。顺便说一句,isEmpty() 是我自己的自定义插件。
  • 如果您只使用keyup 并解决选项卡问题,您将可以更轻松地进行验证。另一个想法:只需使用.change() 事件
  • 更改事件仅在模糊时触发,这使得验证看起来反应迟钝
  • 在按键事件中,shiftKeyctrlKey 属性无关紧要,因为which 属性已经对应于字符代码而不是键代码。
【解决方案2】:

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

【讨论】:

  • 我同意,但是当我使用 keyup 事件时,该字段会验证我是否点击它,导致它接收到使该字段变为红色的错误类。
  • @kmb 那是你不使用keyup的原因?如果是这样,解决该特定问题要比尝试使用keypress 容易得多。
  • 所以你认为我应该只使用 keyup 并检查 tab 键吗?
  • @kmb,@Matt 是正确的,在“不验证键是否为'tab'”中更容易编码。
【解决方案3】:

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

String.fromCharCode(e.which)

看看小提琴

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

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

【讨论】:

  • 对于 jQuery,应该使用e.which
  • @VAShh 我应该将其附加到值并验证吗?
  • 是的,无论如何,为了更好的验证,您应该参考 jQuery 说的 keyup 说 api.jquery.com/keypress
  • 检查更新的小提琴以了解您正在检查的字符串如何变化。
【解决方案4】:

使用 HTML5 input 事件。见this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多