2014-11-22 6 views
0

У меня возникли некоторые проблемы, препятствующие отправке формы по приведенному ниже коду. Форма имеет динамические входы. Их нет, но они добавлены, но пользователи позже. Этот код не отображает весь код динамического поля, но в массивах будет 5 или 6 полей, таких как type [].JQuery prevent form submit

Что я хотел бы сделать, так это предотвратить подачу формы до тех пор, пока не будет добавлен, по крайней мере, 1 набор динамических входов и не будет проверен. Код еще не подтвержден.

Я пробовал образцы кода ниже, но он, похоже, не работает, когда я нажимаю submit без динамических полей, он по-прежнему сбрасывает все входы.

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: вариант установки не игнорировать ничего иного, скрытые поля игнорируются.


Кстати, знаменитый «JQuery 4U» JQuery Validate пример/учебник о худшем я когда-либо видел, и я понятия не имею, что ее автор пытается выполнить всю эту чушь. Действительно, 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--; 
    }); 

}); 

EDIT: После изучения кода более внимательно, то есть required поля, такие как reqName и reqEmail, которые будут блокировать отправки формы, независимо от ваших динамических полей, так что я не совсем уверен, что вы пытаетесь сделать.

Вы также важную синтаксическую ошибку, предотвращающий плагин Validate работать на всех ...

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

Вы не можете иметь имя поля с пробелами. Когда у вас есть -, вы должны заключить name в кавычки. Если это должно быть математикой, вы тоже не можете этого сделать. Так как я не могу найти какой-либо элемент ввода с именем ci - count, я удалил его из кода, а затем вы можете увидеть JQuery Validate работает сейчас ...

http://jsfiddle.net/rpj9s3nt/

Если вы пытаетесь динамически установите правила для полей, которые не существуют, вы не можете сделать это так; в пределах пар ruleskey:value, key может содержать только поле «имя», ничего больше. The .rules('add') method - это то, что вы бы использовали для назначения правил сразу же после динамического создания элементов ввода. В качестве альтернативы вы можете добавлять атрибуты HTML5 при создании элемента, а плагин jQuery Validate автоматически выбирает те, которые преобразуются и преобразуются в собственные правила.

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