2014-11-22 313 views
0

我有一些问题阻止表单提交下面的代码。 表单具有动态输入。没有开始,但他们后来添加,但用户。 此代码不显示所有动态字段代码,但数组中会有5或6个字段,如类型[]。jquery防止表单提交

我想要做的是防止表单提交,直到至少有一组动态输入已被添加和验证。该代码还没有验证。

我试过下面的代码示例,但它似乎没有工作,当我点击提交时没有动态字段,它仍然重置所有输入。

submitHandler: function(form) { 
    form.submit(function(event) { 
     event.preventDefault(); 
    });  
} 
submitHandler: function(form) { 
    form.submit(function() { 
     return false(); 
    });  
} 

如果没有动态字段,我想显示一个错误,告诉他们在表单可以提交之前至少完成1个。

在JQuery中,x是已经创建的字段的数量,所以这就是我所想的可以用来防止表单提交。

预先感谢您。

HTML:

<div class="container"> 
    <h1>AWS CI Reservation</h1> 
    <div class="row"> 
     <div class="col-md-6 pull-right"> 
      <p><strong>Instructions:</strong></p> 
      <div class="well well-sm">...</div> 
     </div> 
     <div class="col-md-6"> 
    <form role="form" id="aws-res-ci" method="POST"> 
     <div class="form-group"> 
      <label for="reqName">Requester's Name:</label> 
      <input type="text" class="form-control" id="reqName" name="reqName" placeholder="Enter Requester's Name"> 
     </div> 
     <div class="form-group"> 
      <label for="reqEmail">Requester's Email:</label> 
      <input type="text" class="form-control" id="reqEmail" name="reqEmail" placeholder="Enter Requester's Email"> 
     </div> 

     <div class="form-group"> 
      <label for="projectNum">Project #: <span style="color:grey;font-size:70%">(if known)</span></label> 
      <input type="text" class="form-control" id="projectNum" placeholder="Enter Project #"> 
     </div> 
     <div class="form-group"> 
      <label for="projectContact">Project Contact:</label> 
      <input type="text" class="form-control" id="projectContact" name="projectContact" placeholder="Enter Project Contact"> 
     </div> 
     <div class="form-group"> 
      <label for="location">Location:</label> 
      <select class="form-control" name="location" id="location"> 
       <option value="">Please choose...</option> 
       <option>1</option> 
       <option>2</option> 
       <option>3</option> 
       <option>4</option> 
       <option>5</option> 
      </select> 
     </div> 
     <div class="form-group"> 
      <label for="bu">Business Unit requested for:</label> 
      <select class="form-control" name="bu" id="bu"> 
       <option value="">Please choose...</option> 
       <option>1</option> 
       <option>2</option> 
       <option>3</option> 
       <option>4</option> 
       <option>5</option> 
      </select> 
     </div> 

     </div> 
    </div> 
     <hr> 
     <div id="no-ci"></div> 
     <div class="input_fields_wrap"> 
      <!-- Start dynamic fields --> 

      <!-- End dynamic fields --> 
     </div> 
     <br> 
     <br> 
      <div class="btn-group pull-right"> 
      <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> 
      Add EC2 Instances <span class="caret"></span> 
      </button> 
      <ul class="dropdown-menu" role="menu"> 
       <li><a href="#" id="add_ec2_instance">Add EC2 Instance</a></li> 
       <li><a href="#" id="add_ec2_instance">Add EC2 Auto Scaling Instance</a></li> 
      </ul> 
     </div> 
     <span class="pull-right">&nbsp;&nbsp;</span> 
     <div class="btn-group pull-right"> 
      <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> 
      Add Database <span class="caret"></span> 
      </button> 
      <ul class="dropdown-menu" role="menu"> 
       <li><a href="#" id="add_rds_instance">Add RDS Instance</a></li> 
       <li><a href="#" id="add_elastic_cache_instance">Add Elastic Cache Instance</a></li> 
       <li><a href="#" id="add_redshift">Add Redshift Istance</a></li> 
      </ul> 
     </div> 
     <span class="pull-right">&nbsp;&nbsp;</span> 
     <div class="btn-group pull-right"> 
      <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> 
      Add Storage <span class="caret"></span> 
      </button> 
      <ul class="dropdown-menu" role="menu"> 
       <li><a href="#" id="add_s3">Add S3 Instance</a></li> 
       <li><a href="#" id="add_glacier">Add Glacier Instance</a></li> 
      </ul> 
     </div> 
     <button type="submit" class="btn btn-default">Submit</button> 
    </form> 

的Jquery:

(function($,W,D) 
    { 
     var JQUERY4U = {}; 

     JQUERY4U.UTIL = 
     { 
      setupFormValidation: function() 
      { 
       //form validation rules 
       $("#aws-res-ci").validate({ 
        rules: { 
         reqName: "required", 
         reqEmail: { 
          required: true, 
          email: true 
         }, 
         projectContact: { 
          required: true 
         }, 
         location: "required", 
         bu: "required", 
         ci-count: { 
          required: true, 
          min: 1 
         } 
        }, 
        messages: { 
         firstname: "Please enter your firstname", 
         lastname: "Please enter your lastname", 
         password: { 
          required: "Please provide a password", 
          minlength: "Your password must be at least 5 characters long" 
         }, 
        }, 
        submitHandler: function(form) { 
         form.submit(); 
        } 
       }); 
      } 
     } 

     //when the dom has loaded setup form validation rules 
     $(D).ready(function($) { 
      JQUERY4U.UTIL.setupFormValidation(); 
     }); 

     //setting up funcations 
     var max_fields    = 10; //maximum input boxes allowed 
     var wrapper     = $(".input_fields_wrap"); //Fields wrapper 
     var add_ec2     = $("#add_ec2_instance"); //Add button ID 

     var x = 0; //initlal text box count 
     //EC2 Instance 
     $(add_ec2).click(function(e){ //on add input button click 
      e.preventDefault(); 
      if(x < max_fields){ //max input box allowed 
       x++; //text box increment 
       $(wrapper).append('<div><input type="text" name="mytext[]"/> \ 
       <a href="#" class="remove_field">Remove</a></div>'); //add input box 
      } 
     });   

     //remove item when told 
     $(wrapper).on("click",".remove_field", function(e){ //user click on remove text 
      e.preventDefault(); $(this).parent('div').remove(); x--; 
     }); 

    })(jQuery, window, document); 

回答

1

你的代码...

submitHandler: function(form) { 
    form.submit(function(event) { 
     event.preventDefault(); 
    });  
} 
submitHandler: function(form) { 
    form.submit(function() { 
     return false(); 
    });  
} 

没有,没有。通过将.submit()放在submitHander之内,您所做的与您尝试实现的完全相反。

要阻止默认form提交action ...

submitHandler: function(form) { 
    return false();  
} 

然而,由于你的描述,你只是要阻止的提交,直到字段添加到窗体,您不能使用submitHandler,因为在所有它会一直阻止提交。由于您无法动态切换或更改这些选项,只需删除submitHandler以允许默认行为。

然后你可能使用一个隐藏的输入字段,并将其设置为required与一个什么都不值。这将通过触发验证错误来阻止提交。当您添加动态字段时,您只需删除该隐藏字段。 (你甚至可以在隐藏字段设置错误消息类似,“请先字段添加到表单。”或什么的。)

您还需要在ignore:选项设置为,否则忽略什么,隐藏的字段被忽略。


BTW,著名的“jQuery的4U” jQuery验证例子/教程是关于我见过的最糟糕的,我不知道它的作者试图与所有的废话来完成。真的,refer to the tag wiki为您所需......

$(document).ready(function() { 

    $("#aws-res-ci").validate({ 
     ignore: [], // ignore nothing; validate hidden fields 
     rules: { 
      // your rules 
     }, 
     messages: { 
      // your messages 
     } 
    }); 

    //setting up funcations 
    var max_fields    = 10; //maximum input boxes allowed 
    var wrapper     = $(".input_fields_wrap"); //Fields wrapper 
    var add_ec2     = $("#add_ec2_instance"); //Add button ID 

    var x = 0; //initlal text box count 
    //EC2 Instance 
    $(add_ec2).click(function(e){ //on add input button click 
     e.preventDefault(); 
     if(x < max_fields){ //max input box allowed 
      x++; //text box increment 
      $(wrapper).append('<div><input type="text" name="mytext[]"/> \ 
      <a href="#" class="remove_field">Remove</a></div>'); //add input box 
     } 
    });   

    //remove item when told 
    $(wrapper).on("click",".remove_field", function(e){ //user click on remove text 
     e.preventDefault(); $(this).parent('div').remove(); x--; 
    }); 

}); 

编辑:更紧密地检查你的代码后,你有required领域,如reqNamereqEmail这将阻止不管形式提交您的动态字段的,所以我不完全知道是什么你正在努力。

也有重大语法错误,防止验证插件从所有工作...

ci - count: { // <- this can only be a field 'name' with or without quotes 
    required: true, 
    min: 1 
} 

不能有空格的字段名。如果您有-,则必须将name放在引号内。如果这应该是数学,那么你也做不到。因为我无法找到名为ci - count任何输入元素,我从你的代码中删除它,然后你可以看到jQuery验证是现在工作...

http://jsfiddle.net/rpj9s3nt/

如果你试图动态在不存在的字段上设置规则,你不能这样做;在ruleskey:value对内,key只能包含一个字段“名称”,没有别的。 The .rules('add') method是您在动态创建输入元素后立即使用的分配规则。或者,您可以在创建元素时添加HTML5属性,并且jQuery Validate插件会自动选择这些属性并将其转换为自己的规则。

<input type="text" name="ci[1]" required="required" min="1" />