jQuery Validate Plugin - Як створити просте користувацьке правило?


351

Як створити просте, власне правило, використовуючи плагін jQuery Validate (використовуючи addMethod), який не використовує регулярний вираз?

Наприклад, яка функція створила б правило, яке підтверджує лише, якщо принаймні одна з групи прапорців встановлена?


41
95 виплат, я думаю, це означає bassistance.de/jquery-plugins/jquery-plugin- валідаційна документація може бути незрозумілою: 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 (елемент) повертає значення true, якщо елемент є null?
tnunamak

12
щоб він працював, "сума" повинна бути ідентифікатором та назвою якогось елемента на сторінці?
Хоанг Довгий

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"
            }
        }
    });
});

Я спробував цей метод, і він працює досить добре, проте, чоловіки, що повертають будь-яку іншу MSG, ніж правда, він все ще не підтверджує "добре", він застряг у "Ім'я користувача вже прийнято", що може бути не так? Я також перевірив, що він повертається належним чином, повторюючи значення, а не повертаючи false та true, і це працює. мені здається, що мій браузер не збирає помилку повернення, повернення правда? це зводить мене з розуму ..
Mikelangelo

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

23
Будьте обережні з цим. Це не повністю функціональний код, оскільки «успіх» AJAX повернеться після «відповіді на повернення». пробігає, внаслідок чого несподівані поведінки
Малахій

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";

Отже, щоб перевірити, чи принаймні один із групи прапорців:

Правило даних -один або більше перевірено

<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

У цьому випадку: форма реєстрації користувача, користувач повинен вибрати ім'я користувача, яке не прийнято.

Це означає, що ми повинні створити індивідуальне правило перевірки, яке надсилатиме запит async 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.