【问题标题】:Unable to use jQuery form validation plugin inside an Angular app无法在 Angular 应用程序中使用 jQuery 表单验证插件
【发布时间】:2015-01-12 19:51:05
【问题描述】:

我最近使用 AngularJS 将我的网站升级为单页应用程序配置。自从我无法使用jQuery form validation plugin。我已经包含了所有需要的文件并检查了路径是否正确,但似乎验证是在浏览器中进行的,而不是在我的代码中。

应用程序分为几个HTML文件,动态注入index.html。我包含所需文件的顺序是:

  • 所有CSS文件都加载到Head中,然后是一些代码,包括<div ng-view></div>
  • 然后我加载 JS 文件:jquery、jquery 验证、jquery 表单插件。

/*validate contact form */
$(function() {
    $('#contactForm').validate({
        rules: {
            inputName: {
                required: true,
                minlength: 2
            },
            inputEmail: {
                required: true,
                email: true
            },
            inputMessage: {
                required: true
            }
        },
        messages: {
            inputName: {
                required: "name needed!",
                minlength: "Your name must consist of at least 2 characters"
            },
            inputEmail: {
                required: "email needed!"
            },
            inputMessage: {
                required: "content required!"
            }
        },//submits the data to the php file using ajax request
        submitHandler: function(form) {
            $('#contactForm').ajaxSubmit({

                type:"POST",
                data: $(form).serialize(),
                url:"index2.php",
                success: function() {
                    $("#contactForm").hide(1000);
                    $("#feedback").html("Message sent!").addClass("success");
                    createDymanicButton();
                },
                error: function() {
                    $("#contactForm").hide(1000);
                    $("#feedback").html("There was an error, please try again later").addClass("failure");

                    createDymanicButton();
                }
            });
        }
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/jquery.validate.js"></script>
<script src="//oss.maxcdn.com/jquery.form/3.50/jquery.form.min.js"></script>

    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
<a href="#myModal" target=_self role="button" class="btn btn-large btn-info" data-toggle="modal">form</a>   
<div class="modal fade" id="myModal">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <button class="close" data-dismiss="modal">&times;</button>

            <h4 class="modal-title">title</h4>
          </div>
          <!-- end modal-header -->
          <div class="modal-body">
            <p>contact form</p>
            <hr>
            <!-- **************** the Form starts here *********-->
            <form class="form-horizontal" role="form" id="contactForm" name="contactForm" method="post">

              <div class="form-group">
                <label class="col-lg-2 control-label" for="inputName">Name</label>
                <div class="col-lg-10">
                  <input class="form-control" id="inputName" name="inputName" placeholder="Your name" type="text" value="" required>
                </div>
              </div>

              <div class="form-group">
                <label class="col-lg-2 control-label" for="inputEmail">Email</label>
                <div class="col-lg-10">
                  <input class="form-control" id="inputEmail" name="inputEmail" placeholder="your@email.com" type="email" value="" required>

                </div>
              </div>

              <div class="form-group">
                <label class="col-lg-2 control-label" for="inputMessage">Message</label>
                <div class="col-lg-10">
                  <textarea class="form-control" id="inputMessage" name="inputMessage" placeholder="Message" rows="3" required></textarea>
                  <button class="btn btn-success pull-right" type="submit" name="submit" id="submit">Send</button>
                  <button class="btn btn-default pull-left" data-dismiss="modal" type="button">Cancel</button>
                </div>
              </div>
            </form>

          </div>
          <!-- end modal-body -->
          <div class="modal-footer">
            <!--the footer that will include some feedback-->
            <div id="feedback"></div>
          </div>
          <!-- end of modal footer -->
        </div>
        <!-- end modal-content -->
      </div>
      <!-- end modal-dialog -->
    </div>
    <!-- end myModal -->

需要验证的表单位于home.html 文件中。 我尝试将自定义 JS 文件和 jQuery 放在 home.html 的开头,但无论我尝试什么,浏览器都是唯一验证我的表单的东西。

请指教

【问题讨论】:

  • 您能提供给我们您的 HTML 表单吗?
  • 谢谢,我添加了表单的 HTML 代码
  • @undroid bootstrap 在没有 jQuery 的情况下无法工作,请重新添加 jQuery 脚本。
  • 是的,抱歉,没注意。无论如何,现在一切都在那里。
  • 这个演示对我来说似乎很好用。

标签: jquery angularjs forms jquery-validate


【解决方案1】:

我在 AngularJS 和 jQuery 验证插件之间建立了一座桥梁。它使用单个指令 ng-validate 验证表单,该指令自动检测 DOM 何时准备就绪。

试一试:https://github.com/jpkleemans/angular-validate。非常感谢您的反馈!

【讨论】:

  • 先生,这是一个很棒的插件。我面临的唯一问题是如何在您的插件中应用 css。?请指导我。
  • 嗨@Steve,您可以使用setDefaults 设置errorclassvalidClass 等内容。然后,您可以将 css 样式应用于这些类。
  • 是的,它成功了,谢谢先生。但现在我面临另一个问题。如何删除表单重置时的所有错误?请先生指导我
【解决方案2】:

我不确定你的困难是什么。我复制了您的 sn-p 并向其中添加了验证代码,它似乎完全按照您的意愿工作。

/*validate contact form */
$(function() {
    $('#contactForm').validate({
        rules: {
            inputName: {
                required: true,
                minlength: 2
            },
            inputEmail: {
                required: true,
                email: true
            },
            inputMessage: {
                required: true
            }
        },
        messages: {
            inputName: {
                required: "name needed!",
                minlength: "Your name must consist of at least 2 characters"
            },
            inputEmail: {
                required: "email needed!"
            },
            inputMessage: {
                required: "content required!"
            }
        },//submits the data to the php file using ajax request
        submitHandler: function(form) {
            $('#contactForm').ajaxSubmit({

                type:"POST",
                data: $(form).serialize(),
                url:"index2.php",
                success: function() {
                    $("#contactForm").hide(1000);
                    $("#feedback").html("Message sent!").addClass("success");
                    createDymanicButton();
                },
                error: function() {
                    $("#contactForm").hide(1000);
                    $("#feedback").html("There was an error, please try again later").addClass("failure");

                    createDymanicButton();
                }
            });
        }
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/jquery.validate.js"></script>
<script src="//oss.maxcdn.com/jquery.form/3.50/jquery.form.min.js"></script>

    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
<a href="#myModal" target=_self role="button" class="btn btn-large btn-info" data-toggle="modal">form</a>   
<div class="modal fade" id="myModal">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <button class="close" data-dismiss="modal">&times;</button>

            <h4 class="modal-title">title</h4>
          </div>
          <!-- end modal-header -->
          <div class="modal-body">
            <p>contact form</p>
            <hr>
            <!-- **************** the Form starts here *********-->
            <form class="form-horizontal" role="form" id="contactForm" name="contactForm" method="post">

              <div class="form-group">
                <label class="col-lg-2 control-label" for="inputName">Name</label>
                <div class="col-lg-10">
                  <input class="form-control" id="inputName" name="inputName" placeholder="Your name" type="text" value="" required>
                </div>
              </div>

              <div class="form-group">
                <label class="col-lg-2 control-label" for="inputEmail">Email</label>
                <div class="col-lg-10">
                  <input class="form-control" id="inputEmail" name="inputEmail" placeholder="your@email.com" type="email" value="" required>

                </div>
              </div>

              <div class="form-group">
                <label class="col-lg-2 control-label" for="inputMessage">Message</label>
                <div class="col-lg-10">
                  <textarea class="form-control" id="inputMessage" name="inputMessage" placeholder="Message" rows="3" required></textarea>
                  <button class="btn btn-success pull-right" type="submit" name="submit" id="submit">Send</button>
                  <button class="btn btn-default pull-left" data-dismiss="modal" type="button">Cancel</button>
                </div>
              </div>
            </form>

          </div>
          <!-- end modal-body -->
          <div class="modal-footer">
            <!--the footer that will include some feedback-->
            <div id="feedback"></div>
          </div>
          <!-- end of modal footer -->
        </div>
        <!-- end modal-content -->
      </div>
      <!-- end modal-dialog -->
    </div>
    <!-- end myModal -->

输入 jquery,然后是 jquery.validate,然后是 jquery.form,然后是 bootstrap,然后是您的验证代码。如果要强制它们按顺序加载,请将 jquery、jquery.validate、jquery.form 和 bootstrap 放在 &lt;head&gt; 中。这将按顺序加载它们,但在它们全部完成加载之前不会呈现 HTML,这会减慢页面加载时间。自定义验证代码应该放在 &lt;body&gt; 中,但它由您决定,因为它包含在 jQuery 的 document.ready 函数($(function () {...});)中。

【讨论】:

  • 这段代码曾经按预期工作,直到我将我的文件分成几个HTML 文件(动态注入内容),现在看来我的 JS 文件不是负责验证形式。您在 IDE 中添加 jquery/js 文件的顺序是什么?我希望我的自定义文本出现,而不是浏览器的默认文本。
  • @undroid 确保在所有 Angular 视图都被渲染后调用$('#contactForm').validate()。我猜你会发现$('#contactForm').length 在你调用它的时候是零
  • Patrick,无济于事.. Juan,长度为 1,所以我想所有内容都已加载.. 但以防万一,在我调用 validate 函数之前,我如何确定它确实已加载?
【解决方案3】:

我认为您可以参考此链接以供参考,该链接在 angularjs 应用程序中使用 jquery.validate.js 插件 https://codepen.io/kalaiselvan/pen/PzBNBY

enter link description here //使用 Angularjs 和 jquery.validate.js 与 ui.bootstrap 和 ui.utils 进行表单验证

  var app=angular.module('formvalid', ['ui.bootstrap','ui.utils']);
  app.controller('validationCtrl',function($scope){
  $scope.validationOpt = {
      rules: {
         name: {
           required: true,
           minlength: 3
         },
         urlfield: {
           required: true,
           minlength: 3,
           url: true
        },dropdown:{
          required:{
          depends: function(element) {
                    return $("#dropdown").val() == '';
                 }
        }
       },'test[]': {
         required: true,
          minlength:2
       },
        namecallback:{
          required:true,
          callBackFunction:function(value,element){
            //business logic functions
          }
       }
    },
    messages: {
        'test[]': {
            required: "You must check at least 1 box",
            maxlength: "Check no more than {0} boxes",
            minlength:"Pleace check {0} boxes"
        }
   },    
   submitHandler : function() {
      $("#formid").validate().resetForm();  
      $('#formid')[0].reset();
     //for multipart
      /*    $http({
            method : 'POST',
            url : '',
            headers : {
                'Content-Type' : undefined
            },
            data : formData,
            transformRequest : function(data, headersGetterFunction) {
                return data;
            }
            }).success(function(response) {
                msg = response.data;
                type = "success";     
            }).error(function(response) {
                msg = response.data;
               type = "error"
            });*/
         }
       };  
       $scope.data=[{id:1,name:"One"},{id:2,name:"two"},    {id:3,name:"three"}];
      $scope.formsubmit=function(){
     //alert("hai");
      }
    });


    <div class="container" ng-app="formvalid">
      <div class="panel" data-ng-controller="validationCtrl">
      <div class="panel-heading border">    
      <h2>Form validation using Angularjs  and jquery.validate</h2>
   </div>
  <div class="panel-body">
   <form id="formid" role="form" ui-jq="validate" ui-options="validationOpt" ng-submit="formsubmit()">
    <div class="form-group mb25">
    <p> drop down box validation with </p>
    <div>
      <select class="form-control" name="dropdown" ng-model="dropdown"  id="dropdown">
        <option value="">-Select-</option>
        <option ng-repeat="i in data" value="{{i.id}}">{{i.name}}</option>
      </select>
    </div>
  </div>
   <div class="form-group mb25">
    <p> check box validations</p>
    <div>
      <input type="checkbox" name="test[]" />x
      <input type="checkbox" name="test[]" />y
      <input type="checkbox" name="test[]" />z

    </div>
  </div>
  <div class="form-group mb25">
    <p>Required | minimum length 3 characters</p>
    <div>
      <input type="text" class="form-control" name="namecallback" placeholder="Required | minimum length 3 characters">
    </div>
  </div>

  <div class="form-group mb25">
    <p>Required | valid email format</p>
    <div>
      <input type="email" class="form-control" name="email" placeholder="Required | valid email format" required>
    </div>
  </div>

  <div class="form-group mb25">
    <p>Required | valid url format</p>
    <div>
      <input type="url" class="form-control" name="url" placeholder="Required | valid url format" required>
    </div>
  </div>

  <div class="form-group mb25">
    <p>Required | number</p>
    <div>
      <input type="number" class="form-control" name="number" placeholder="Required | number" required>
    </div>
  </div>

  <div class="form-group mb25">
    <p>Required | number | min 10</p>
    <div>
      <input type="number" min="10" class="form-control" name="number-min" placeholder="Required | number | min 10" required>
    </div>
  </div>

  <div class="form-group mb25">
    <p>Required | number | max 10</p>
    <div>
      <input type="number" max="10" class="form-control" name="number-max" placeholder="Required | number | max 10" required>
    </div>
  </div>

  <div class="form-group mb25">
    <p>Required | number | min 0 | max 100</p>
    <div>
      <input type="number" min="0" max="100" class="form-control" name="number-num" placeholder="Required | number | min 0 | max 100" required>
    </div>
  </div>

  <div class="form-group">
    <label></label>
    <div>
      <button class="btn btn-primary mr10">Submit</button>
      <button class="btn btn-default">Reset</button>
    </div>
  </div>
</form>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多