2014-11-22 311 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" />