How to make select2 work with jquery.validation plugin?

后端 未结 15 581
北荒
北荒 2020-12-01 02:40

I\'m trying to validate select2 field using jquey.validation plugin but nothing happens.

I want to make select required field.

I\'m using this custom validat

相关标签:
15条回答
  • 2020-12-01 03:21

    check out my code. I solve my problem by using those codes... few(css,jquery) codes only

    $(document).ready(function() {
    
      //form validations---------------------------------------------------------
      $('#sample').validate({
        ignore: [],
        errorClass: "error",
        errorElement: "span"
      });
    
      $("#receiver_name").select2({
        placeholder: "Receiver Name"
      });
    
      $("#receiver_name").select2().change(function() {
        $(this).valid();
      });
    });
    .error .select2-choice.select2-default,
    .error .select2-choices {
      color: #a94442;
      border-color: #a94442;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
    }
    .error:focus,
    .error .select2-choice.select2-defaultLfocus,
    .error .select2-choicesLfocus {
      border-color: #843534;
      -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
      box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
    }
    .select2-container .select2-choices .select2-search-field input,
    .select2-container .select2-choice,
    .select2-container .select2-choices,
    .error {
      border-radius: 1px;
    }
    <html>
    
    <head>
      <!-- Latest compiled and minified CSS -->
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
    
      <!-- Optional theme -->
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">
    
      <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.css" rel="stylesheet" />
    
      <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2-bootstrap.css" rel="stylesheet" />
    
    
    </head>
    
    <body>
      <form id='sample'>
        <select class="form-control" name="receiver_name[]" id="receiver_name" multiple required>
          <option value="1">1</option>
          <option value="2">2</option>
        </select>
      </form>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
      <!-- Latest compiled and minified JavaScript -->
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
    
      <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.2/select2.js"></script>
    
    
    </body>
    
    </html>

    0 讨论(0)
  • 2020-12-01 03:21
    $("select.select2-me").each(function(index, el) {
    
        if ($(this).is("[data-rule-required]") && 
        $(this).attr("data-rule-required") == "true") {
            $(this).on('select2-close', function(e) {
                $(this).valid()
            });
        }
    });
    

    work for me.

    0 讨论(0)
  • 2020-12-01 03:22

    just add a line in your validation function.

    $('#_form_id').validate({
    
           ignore: 'input[type=hidden]',
                rules: {
                    //Rules
                },
                messages: {
                   //messages
                },
    }
    
    0 讨论(0)
  • 2020-12-01 03:24

    I have detailed this in a blog post: http://chadkuehn.com/jquery-validate-select2/

    When you place a Select2 on a SELECT tag it hides the original element. So in the validation plugin you must adjust the proper wrapping markup when highlighting and unhighlighting.

        highlight: function (element, errorClass, validClass) {
            var elem = $(element);
            if (elem.hasClass("select2-offscreen")) {
                $("#s2id_" + elem.attr("id") + " ul").addClass(errorClass);
            } else {
                elem.addClass(errorClass);
            }
        },
    
        unhighlight: function (element, errorClass, validClass) {
            var elem = $(element);
            if (elem.hasClass("select2-offscreen")) {
                $("#s2id_" + elem.attr("id") + " ul").removeClass(errorClass);
            } else {
                elem.removeClass(errorClass);
            }
        }
    

    View a DEMO here.

    0 讨论(0)
  • 2020-12-01 03:25

    As a tip, please consider that the validate js bind itself to changes of select not select 2. This cause problem in below case:

    1. There is a required select box which is converted to select2
    2. You click the submit and the error shows that the select box is required.
    3. You select some option from select 2.
    4. The validation error does not hide automatically

    You can fix it with:

         $("select").on("select2:close", function (e) {  
            $(this).valid(); 
        });
    
    0 讨论(0)
  • 2020-12-01 03:27

    In Addition to ABIRAMAN's answer here is some code that

    • Makes the select2 box red when errors appear
    • List the error below the select2 box

    <style>
      span.error{
        outline: none;
        border: 1px solid #800000;
        box-shadow: 0 0 5px 1px #800000;
      }
    </style>
    

    <script>
     $("#form").validate({
         rules: {
           email: "required"
         },
         highlight: function (element, errorClass, validClass) {
           var elem = $(element);
           if (elem.hasClass("select2-hidden-accessible")) {
               $("#select2-" + elem.attr("id") + "-container").parent().addClass(errorClass); 
           } else {
               elem.addClass(errorClass);
           }
         },    
         unhighlight: function (element, errorClass, validClass) {
             var elem = $(element);
             if (elem.hasClass("select2-hidden-accessible")) {
                  $("#select2-" + elem.attr("id") + "-container").parent().removeClass(errorClass);
             } else {
                 elem.removeClass(errorClass);
             }
         },
         errorPlacement: function(error, element) {
           var elem = $(element);
           if (elem.hasClass("select2-hidden-accessible")) {
               element = $("#select2-" + elem.attr("id") + "-container").parent(); 
               error.insertAfter(element);
           } else {
               error.insertAfter(element);
           }
         }
       });
    
    $('select').select2({}).on("change", function (e) {
      $(this).valid()
    });
    </script>
    
    0 讨论(0)
提交回复
热议问题