jQuery Validate Plugin - Как создать простое пользовательское правило?


351

Как создать простое настраиваемое правило с помощью плагина jQuery Validate (using addMethod), в котором не используется регулярное выражение?

Например, какая функция создаст правило, которое проверяет только если установлен хотя бы один из группы флажков?


41
95 голосов, я думаю, это означает, что документация bassistance.de/jquery-plugins/jquery-plugin-validation может быть неясной: P
Саймон Арнольд

Не знаю, продолжаете ли вы поиск (4 года спустя), но это может помочь learn.jquery.com/plugins/…
Рон ван дер Хейден

Ответы:


376

Вы можете создать простое правило, выполнив что-то вроде этого:

jQuery.validator.addMethod("greaterThanZero", function(value, element) {
    return this.optional(element) || (parseFloat(value) > 0);
}, "* Amount must be greater than zero");

А потом применить это так:

$('validatorElement').validate({
    rules : {
        amount : { greaterThanZero : true }
    }
});

Просто измените содержимое addMethod, чтобы подтвердить свои флажки.


23
Что такое this.optional (элемент) || делать в этой функции? Кажется, что это есть в каждом правиле, но я не могу сказать, почему оно было бы уместно для любого правила, кроме «обязательного».
machineghost

38
Отказ от этого будет означать, что метод всегда будет применяться, даже если элемент не требуется.
Марк Спенглер

Я так понимаю, что this.optional (element) возвращает true, если element равен нулю?
tnunamak

12
для того, чтобы он запускался, «количество» должно быть идентификатором и именем некоторого элемента на странице?
Hoàng Long

6
Да, количество относится к атрибуту имени некоторого поля формы ввода.
Марк Спенглер

96
$(document).ready(function(){
    var response;
    $.validator.addMethod(
        "uniqueUserName", 
        function(value, element) {
            $.ajax({
                type: "POST",
                url: "http://"+location.host+"/checkUser.php",
                data: "checkUsername="+value,
                dataType:"html",
                success: function(msg)
                {
                    //If username exists, set response to true
                    response = ( msg == 'true' ) ? true : false;
                }
             });
            return response;
        },
        "Username is Already Taken"
    );

    $("#regFormPart1").validate({
        username: {
            required: true,
            minlength: 8,
            uniqueUserName: true
        },
        messages: {
            username: {
                required: "Username is required",
                minlength: "Username must be at least 8 characters",
                uniqueUserName: "This Username is taken already"
            }
        }
    });
});

Я попробовал этот метод, и он работает довольно хорошо, однако, мужчины, возвращающие любое другое сообщение, отличное от true, все еще не проверяют "хорошо", оно застряло в "Имя пользователя уже принято", что может быть не так? Я также проверил, что он возвращается должным образом, отображая значения вместо того, чтобы возвращать false и true, и это работает. мне кажется, что мой браузер не принимает возврат false, возвращать true? это сводит меня с ума ..
Микеланджело

1
заставить его работать, вставив переменную, которая вызывается как результат перед addmethod, кажется истинным, ложные значения правильно регистрируются в функции успеха
Mikelangelo

23
Будьте осторожны с этим. Это не полностью функциональный код, так как «успех» AJAX будет возвращаться после «return response»; работает, что приводит к неожиданному поведению
Малахи

1
@Malachi правильно. Это можно исправить, выполнив вызов синхронизации, но это противно. Интересно, есть ли другой способ достичь этого? Есть, remoteкак другие предложили, но, насколько я могу судить, это разрешает только одну проверку, поэтому она не будет работать, если вам потребуется две асинхронные проверки или иметь несколько сообщений об ошибках в зависимости от ответа.
Адам Бергмарк

2
есть удаленный метод для проверки jquery: jqueryvalidation.org/remote-method
TecHunter,

70
// add a method. calls one built-in method, too.
jQuery.validator.addMethod("optdate", function(value, element) {
        return jQuery.validator.methods['date'].call(
            this,value,element
        )||value==("0000/00/00");
    }, "Please enter a valid date."
);

// connect it to a css class
jQuery.validator.addClassRules({
    optdate : { optdate : true }    
});

7
addClassRules - хорошее дополнение к ответу.
Четыре

@commonpike Это именно то, что я искал, большое спасибо.
Симба

46

Пользовательское правило и атрибут данных

Вы можете создать собственное правило и прикрепить его к элементу, используя dataатрибут, используя синтаксисdata-rule-rulename="true";

Итак, чтобы проверить, установлен ли хотя бы один из группы флажков:

данные правила oneormorechecked

<input type="checkbox" name="colours[]" value="red" data-rule-oneormorechecked="true" />

addMethod

$.validator.addMethod("oneormorechecked", function(value, element) {
   return $('input[name="' + element.name + '"]:checked').length > 0;
}, "Atleast 1 must be selected");

И вы также можете переопределить сообщение правила (то есть: Atleast 1 должен быть выбран) с помощью синтаксиса data-msg-rulename="my new message".

НОТА

Если вы используете data-rule-rulenameметод, вам нужно убедиться, что имя правила написано строчными буквами. Это связано с тем, что функция проверки jQuery dataRulesприменяется .toLowerCase()для сравнения, а спецификация HTML5 не допускает прописные буквы.

Рабочий пример

$.validator.addMethod("oneormorechecked", function(value, element) {
  return $('input[name="' + element.name + '"]:checked').length > 0;
}, "Atleast 1 must be selected");

$('.validate').validate();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.min.js"></script>

<form class="validate">
    red<input type="checkbox" name="colours[]" value="red" data-rule-oneormorechecked="true" data-msg-oneormorechecked="Check one or more!" /><br/>
    blue<input type="checkbox" name="colours[]" value="blue" /><br/>
    green<input type="checkbox" name="colours[]" value="green" /><br/>
    <input type="submit" value="submit"/>
</form>


2
только для jquery.validate ver> = 1.10
Павел Назаров

Я не смог бы найти это в официальной документации, я бы хотел, чтобы они прояснили это. Спасибо!
Джош Мак

22

Спасибо, это сработало!

Вот окончательный код:

$.validator.addMethod("greaterThanZero", function(value, element) {
    var the_list_array = $("#some_form .super_item:checked");
    return the_list_array.length > 0;
}, "* Please check at least one check box");

13

Вы можете добавить собственное правило, например:

$.validator.addMethod(
    'booleanRequired',
    function (value, element, requiredValue) {
        return value === requiredValue;
    },
    'Please check your input.'
);

И добавьте это как правило так:

PhoneToggle: {
    booleanRequired: 'on'
}        

1

Для этого случая: форма регистрации пользователя, пользователь должен выбрать имя пользователя, которое не используется.

Это означает, что мы должны создать настроенное правило проверки, которое будет отправлять асинхронный HTTP-запрос с удаленного сервера.

  1. создайте элемент ввода в вашем HTML:
<input name="user_name" type="text" >
  1. объявите правила проверки формы:
  $("form").validate({
    rules: {
      'user_name': {
        //  here jquery validate will start a GET request, to 
        //  /interface/users/is_username_valid?user_name=<input_value>
        //  the response should be "raw text", with content "true" or "false" only
        remote: '/interface/users/is_username_valid'
      },
    },
  1. удаленный код должен выглядеть так:
class Interface::UsersController < ActionController::Base
  def is_username_valid
    render :text => !User.exists?(:user_name => params[:user_name])
  end
end
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.