【问题标题】:jQuery Validate seems to pass invalid form to submitHandlerjQuery Validate 似乎将无效表单传递给 submitHandler
【发布时间】:2014-05-15 14:29:08
【问题描述】:

当三个字段包含除数字以外的任何字符时,我正在尝试使用 jQuery Validate 来阻止我的 ajax 表单提交。显然我做错了什么,但我看不到什么。

编辑:似乎有两个错误。我的验证规则使用字段 ID 而不是字段名称。但是,在解决了这个问题后,表单仍然会意外验证..

这是我的 jQuery 代码:

(function() {
  $(document).ready(function() {

    formSubmits();

    /**
     * Handles all the form submits that go on.
     * This is primarily the ID search and the form submit.
     */
    function formSubmits() {

      /*** SAVE RECIPE ***/
      // validate form
      $("#category-editor").validate({
        rules: {
          "time-prep": {number: true},    /* not sure why validation doesn't work.. */
          "time-total": {number: true},   /* according to this, it should: http://goo.gl/9z2odC */
          "quantity-servings": {number: true}
        },
        submitHandler: function(form) {

          // submit changes
          $.getJSON("setRecipe.php", $(form).serialize() )
            .done(function(data) {

              // de-empahaize submit button
              $('.footer input[type=submit]')
                .removeClass('btn-primary')
                .addClass('btn-default');
            });

          // prevent http submit
          return false;
        }
      });
    }
  });
})(jQuery);

这是我在 submitHandler 中放置断点时在检查器中看到的内容。尽管输入错误(值是 'dsdfd' 而不是 '123'),它仍会到达 submitHandler

这是相关的标记:

<form id="category-editor" class="form-inline" method="get">

....
                <div class='form-group'>
                  <div>
                    <label for="time-prep">Prep time (min):</label>
                    <input value="" id="time-prep" name="activeTime" class="form-control min-calc jqValidateNum" data-calc-dest="time-prep-desc" type="number"> 
                    <input value="" id="time-prep-desc" name="activeTimeDesc" class="form-control subtle" type="text"> 
                  </div>
                </div>

                <div class='form-group'>                    
                  <div>
                    <label for="time-total">Total time (min):</label>
                    <input value="" id="time-total" name="totalTime" class="form-control min-calc jqValidateNum" data-calc-dest="time-total-desc" type="number"> 
                    <input value="" id="time-total-desc" name="totalTimeDesc" class="form-control subtle" type="text"> 
                  </div>
                </div>

                <div class='form-group'>                    
                  <div>
                    <label for="quantity-servings">Servings:</label>
                    <input value="" id="quantity-servings" name="servings" class="form-control jqValidateNum" type="number"> 
                  </div>
                </div>

....
</form>

【问题讨论】:

  • 您为什么要使用以下答案中的代码编辑您的 OP?现在 Pointy 的正确答案毫无意义,您问题中的代码应该可以正常工作。
  • 表单的其余标记在哪里? form 标签在哪里?
  • 简单的火花。在你投反对票之前,在 cmets/edits 之间给我一点时间 - 这仍然是一个相关的问题。
  • Easy there doublejack...请告诉我哪里说我对你投了反对票?
  • 您不应该以这样的方式编辑问题,以使完美的答案无效……这会让未来的读者感到困惑。 Pointy 修复了代码中最明显的损坏部分,因此您的问题应该继续反映这一点。

标签: javascript jquery ajax jquery-validate


【解决方案1】:

您已经使用&lt;input&gt; 元素的“id”值而不是它们的“name”值设置了规则。应该是:

    rules: {
      "activeTime": {number: true}, 
      "totalTime": {number: true},
      "servings": {number: true}
    },

edit — 既然您已经解决了这个问题,我认为问题在于输入元素的“值”属性是空的,因为您已将它们声明为 type=number。 Firefox 和 Chrome 允许您在字段中输入任何内容,但它们不会有非空值,除非字段确实包含数字。

如果您还根据需要标记字段,则它可以工作。 fiddle

【讨论】:

  • 这是正确的答案(基于原始问题),但是 OP 已经编辑了他的代码,所以这个答案不再有意义。
  • 谢谢。不幸的是,这似乎不是我唯一的问题 - 我的代码仍然无法正常工作。我已更正我的帖子以反映当前问题。
  • 所以当您单步执行代码时,您仍然可以在调试器中看到它通过验证,并且您确定浏览器中的代码肯定会更新以反映字段名称?
  • @doub1ejack 问题的根源在于桌面浏览器对type=number 输入的行为非常愚蠢。您可以编写自定义验证器,但它也会遇到同样的问题:您的代码将无法区分 真正 空输入和其中包含无效数字的输入.
  • @doub1ejack 我通过为触摸和非触摸浏览器生成(客户端)不同代码来解决我自己网站中的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多