我在这里摆弄我的问题。

我在表单中有一系列选择,全都带有name player[] 我想检查以下内容:

  1. 全部需要
  2. 至少有2个item.val() !== "none"
  3. 至少一个item.text() === "me"

我的验证器自定义规则是:

var form = $("#player_form");

$.validator.addMethod(
  "minPlayers",
  function(value, element, requiredValue) {
    var noPlayerCount = 0;
    $("[id^=player-]").each(function(i) {
      if (($(this).find('option:selected').val() !== 'none') && ($(this).find('option:selected').val() !== '')) {
        noPlayerCount++;
      }
    });
    if (noPlayerCount < requiredValue) {
      return false;
    }
    return true;
  },
  "You need more than 1 player for a game"
);

$.validator.addMethod(
  "mePlayer",
  function(value, element, requiredValue) {
    var meCount = 0;
    $("[id^=player-]").each(function(i) {
      if ($(this).find('option:selected').text() === 'me') {
        meCount++;
      }
    });
    if (meCount !== requiredValue) {
      return this.check($('#player-1'));
    }
    return this.valid();
  },
  "You need to be in the game"
);

form.validate({
  rules: {
    game_name: {
      required: true,
      maxlength: 14
    },
    difficulty: {
      required: true
    },
    'player[]': {
      required: true,
      minPlayers: 2,
      mePlayer: 1
    }
  },
  messages: {
    game_name: {
      required: "Name your game",
      minlength: $.validator.format("Your game name can be a max of {0} chars")
    },
    difficulty: {
      required: "Please select a difficulty"
    },
    'player[]': {
      required: "A player cannot be blank"
    }
  },
  submitHandler: function(form) {
    alert("SUBMITTED!");
    return false;
  }
});

此代码遇到无限循环/最大堆栈大小。 我错过了什么? 谢谢!

#1楼 票数:1 已采纳

我修了几件事...

在HTML中: selected=''不好。 此属性是布尔值。 缺少,它是假的,表示它是真实的...并且可以设置为true / false,但不能设置为空。

在JS中:

$("[id^=player-]").each(function(i) {循环播放所有以player-开头的id元素。您有8个player-n和8个player-nickname-n ,所以它在增加到16位玩家。

当检查选项的文本if ($(this).find('option:selected').text() === 'me') { ,如果文本为“ Me”,则返回false。 那是区分大小写的。

最后,无论您在提供给.addMethod作为第二个参数的函数中做什么,它都必须返回true或false。 试图返回其他东西会导致无限循环。...不要问我为什么。

因此,这是您的代码已修复,我保留了用于调试的所有控制台日志。

var form = $("#player_form");

$.validator.addMethod(
  "minPlayers",
  function(value, element, requiredValue) {
  console.log("requiredValue1: "+requiredValue);
    var noPlayerCount = 0;
    $("[id^=player-]").each(function(i) {
      console.log ("option value: "+$(this).find('option:selected').val());

      if (($(this).find('option:selected').text() !== 'None')){ //} && ($(this).find('option:selected').val() !== '')) {
        noPlayerCount++;
      }
    });

    console.log("noPlayerCount: "+noPlayerCount);
    if (noPlayerCount < requiredValue) {

      return false;
    }
    return true;
  },
  "You need more than 1 player for a game"
);

$.validator.addMethod(
  "mePlayer",
  function(value, element, requiredValue) {
  console.log("requiredValue2: "+requiredValue);
    var meCount = 0;
    $("[id^=player-]").each(function(i) {
      if ($(this).find('option:selected').text() === 'Me') {    // Capital "M"
        meCount++;
      }
    });
    if (meCount !== requiredValue) {
      return false; //this.check($('#player-1'));     // Validator must return true or false.
    }
    return true;  //this.valid();                     // Validator must return true or false.
  },
  "You need to be in the game"
);

form.validate({
  rules: {
    game_name: {
      required: true,
      maxlength: 14
    },
    difficulty: {
      required: true
    },
    'player[]': {
      required: true,
      minPlayers: 2,
      mePlayer: 1
    }
  },
  messages: {
    game_name: {
      required: "Name your game",
      minlength: $.validator.format("Your game name can be a max of {0} chars")
    },
    difficulty: {
      required: "Please select a difficulty"
    },
    'player[]': {
      required: "A player cannot be blank"
    }
  },
  submitHandler: function(form) {
    alert("SUBMITTED!");
    return false;
  }
});

$("#my_button").click(function() {
  var form = $("#ajax_login_form");
  form.validate();
})

更新小提琴

  ask by TheRealPapa translate from so

未解决问题?本站智能推荐:

1回复

jQuery自定义验证器

我正在使用jQuery验证插件,并且希望添加一些自定义逻辑。 我有一系列复选框,这些复选框具有与之关联的子级复选框。 对于这些父复选框中的某些(不是全部),我想要求选中其中一个子复选框。 我对此没有硬编码的问题,所以我向DOM中添加了一个像这样的字段: 然后添加这样的自定义验证器:
1回复

自定义jQuery验证器

我有以下代码: 并验证: 默认情况下,验证为false时,验证程序将写入label 。 我不想添加带有错误描述的元素。 我想使用类wrap_input向父div添加类error 。 我怎样对验证者说呢? 谢谢。
1回复

我需要带有自定义错误消息的jQuery自定义验证器

我正在将VS 2010与MVC 3和无干扰的验证配合使用。 我试图创建一个自定义范围验证器,以在输入值可以接受但意外的地方包含警告。 (我具有通过使用表单验证器的ignore选项来递减值来提交值的功能) 不引人注意的组件是: 我已经对动态错误消息进行了广泛的搜索,该错误消息似乎可以归
1回复

jQuery验证自定义错误

我目前正在开发一个项目,并且在使用此插件时遇到了很多困难,我设法使其正常运行而没有自定义错误,我遇到的一个问题是,如果我在所有元素上都需要标签,则电子邮件无法正常工作,但是当我拥有它时仅在电子邮件输入上有效。 当我尝试运行自定义验证时,单击“提交”按钮没有任何错误。 $(documen
1回复

jQuery中的自定义验证

我有一个验证规则。 但是我希望它以自定义的方式表现。 这是我的规则: 和错误消息: 在规则中,如果我在第一笔划中按特殊字符,则会向我显示错误消息。 我所做的任何错误都会向我显示相同的错误消息。 我希望它根据我的错误行事。 即 如果我输入4个字符,则应该显示其他错误消
1回复

jQuery自定义表单验证

我使用jQuery进行自定义表单验证。 我的问题是,当它警告错误时,我会在单独的警告对话框中获取所有错误。我的目标是让它在1个警告中列出所有错误。 我该如何实现? 这是我的代码:
4回复

发送自定义jQuery验证表单

我一直在进行一些自定义验证(非常基础)。 它完成了我需要做的事情,但是我无法解决如何提交表单。 我以为返回true会起作用,但可悲的是不会。 这是我当前正在使用的代码。 我想要的所有输入字段中都包含必需的类。
1回复

jQuery验证插件和自定义输入

我正在使用此插件来验证表单。 我遇到的问题之一是文本字段之一是BBCode插件,因此在验证该字段时没有任何反应。 文字Write the body of your tutorial下方,使用了bbcode插件,该插件添加了一堆HTML和一个单独的输入框,您必须使用此代码来获取值 所以理