我的JQuery验证插件使用复选框输入表现奇怪

时间:2015-08-30 23:07:54

标签: javascript jquery validation plugins jquery-plugins

我编写了自己的通用验证插件,它使用一个函数来检查输入是否有效,然后对第一个函数确定输入有效且无效的每种情况进行回调。 / p>

基本上,该插件包含两个功能,' $。fn.validation()'将包含验证逻辑和成功/失败回调的对象绑定到元素,然后' $。fn.validate()'要么调用验证对象,要么在其中传入新对象,将为此一个实例使用新对象。可以在此处找到下面描述的插件和a jsfiddle demonstrating the issues的实现。

我的问题是虽然文本输入和texareas似乎在所有情况下都能很好地工作,但是根据如何选择某些元素(例如复选框输入),尽管元素在由元素返回的元素集中,但元素可能无法验证。 jQuery元素

例如,以下选择器不会导致复选框被验证

$('input, textarea').validate();

然而,更具体的选择器将导致复选框被验证

$('input[type=checkbox]').validate();

再次,please checkout the jsfiddle我已经复制了问题

1 个答案:

答案 0 :(得分:1)

问题是您在this.each()代码中的.validate()循环中 提取验证选项

  $.fn.validate = function(options){

    var validation = $.extend({
      check: $(this).data("check") || function(input){ return true },
      success: $(this).data("success") || function (input){},
      failure: $(this).data("failure") || function (input){}
    }, options);

    var valid = true;

    this.each(function(){
      if(validation.check($(this))){
        validation.success($(this));
      } else {
        validation.failure($(this));
        valid = false;
      }
    });

    return valid;
  };

设置validation时,您将获取所选列表中第一个元素的验证配置,这将是用于所有元素的验证配置。

相反,该代码应该在this.each()回调中:

$.fn.validate = function (options) {


    var valid = true;

    this.each(function () {
        var validation = $.extend({
            check: $(this).data("check") || function (input) {
                return true
            },
            success: $(this).data("success") || function (input) {},
            failure: $(this).data("failure") || function (input) {}
        }, options);
        if (validation.check($(this))) {
            validation.success($(this));
        } else {
            validation.failure($(this));
            valid = false;
        }
    });

    return valid;
};

当您单独执行input[type=checkbox]时,它会起作用,因为验证配置将是复选框的配置(该选择器选择的唯一元素)。