Как создать простое настраиваемое правило с помощью плагина jQuery Validate (с использованием addMethod), которое не использует регулярное выражение?
Например, какая функция создаст правило, которое проверяет, только если установлен хотя бы один флажок из группы?
Не знаю, ищете ли вы все еще (4 года спустя), но это может помочь learn.jquery.com/plugins/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете создать простое правило, сделав что-то вроде этого:
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, чтобы проверить ваши флажки.
Что такое this.optional (element) || что делать в этой функции? Кажется, что это есть в каждом правиле, но я не могу сказать, почему это применимо к любому правилу, кроме «обязательного».
Если его не указывать, метод будет применяться всегда, даже если элемент не требуется.
Я так понимаю, this.optional (element) возвращает true, если element имеет значение null?
для его запуска "amount" должно быть идентификатором и именем некоторого элемента на странице?
Да, сумма относится к атрибуту имени некоторого поля формы ввода.
Спасибо, сработало!
Вот последний код:
$.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");
$(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"
}
}
});
});
Я пробовал этот метод, и он работает довольно хорошо, однако мужчины, возвращающие любое другое сообщение, кроме истины, все еще не проверяют «хорошо», он застревает в «Имя пользователя уже занято», что может быть не так? Я также проверил, что он возвращается правильно, повторяя значения вместо того, чтобы возвращать false и true, и это работает. мне кажется, что мой браузер не улавливает return false, return true? это сводит меня с ума ..
заставил его работать, вставив переменную, которая называется result, перед addmethod, кажется, истинные, ложные значения регистрируются правильно в функции успеха
@Mikelangelo: Можете ли вы показать нам, что вы имеете в виду под «добавлением переменной перед addMethod»? Я потерялся на этой линии, и у меня те же проблемы, что и у вас. Заранее спасибо!
@Mikelangelo, я встретил ту же проблему, помогите мне, даже если true возвращается jquery.validate shoes из ошибки
@Matthew: Зачем нужна дополнительная переменная? Что не так с return !(msg == "true"); или каким-то другим эквивалентом логического отрицания в JavaScript?
Как можно найти здесь: http://stackoverflow.com/questions/2628413/jquery-validator- и-настраиваемое-правило-это при-использует-ajax Улучшение ответа Трейси, переменная isSuccess, возможно, является переменной «результата», о которой говорит Микеланджело.
Будьте осторожны с этим. Это не полностью функциональный код в том смысле, что "успех" AJAX вернется после 'return response'; запускается, что приводит к неожиданному поведению
Согласитесь с @Malachi, $ .ajax является асинхронным, поэтому response будет возвращен до того, как вызов AJAX вернется.
@Malachi прав. Это можно исправить, выполнив вызов синхронизации, но это неприятно. Интересно, есть ли другой способ добиться этого? Существует remote, как предлагали другие, но, насколько я могу судить, он допускает только одну проверку, поэтому он не сработает, если вам нужно выполнить две асинхронные проверки или иметь несколько сообщений об ошибках в зависимости от ответа.
есть удаленный метод для проверки jquery: jqueryvalidation.org/remote-method
// 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 }
});
addClassRules - хорошее дополнение к ответу.
@commonpike Это именно то, что я искал, большое спасибо.
Вы можете создать собственное правило и прикрепить его к элементу с помощью атрибута data, используя синтаксис data-rule-rulename = "true";.
Итак, чтобы проверить, отмечен ли хотя бы один из группы флажков:
data-rule-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");
И вы также можете переопределить сообщение правила (например: необходимо выбрать хотя бы 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>только для jquery.validate ver> = 1.10
Я не мог найти это в официальной документации, я бы хотел, чтобы это было более ясным. Спасибо!
Вы можете добавить собственное правило следующим образом:
$.validator.addMethod(
'booleanRequired',
function (value, element, requiredValue) {
return value === requiredValue;
},
'Please check your input.'
);
И добавляйте его как правило так:
PhoneToggle: {
booleanRequired: 'on'
}
В этом случае: форма регистрации пользователя, пользователь должен выбрать имя пользователя, которое не используется.
Это означает, что мы должны создать настраиваемое правило проверки, которое будет отправлять асинхронный HTTP-запрос с удаленным сервером.
<input name = "user_name" type = "text" >
$("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'
},
},
class Interface::UsersController < ActionController::Base
def is_username_valid
render :text => !User.exists?(:user_name => params[:user_name])
end
end
Шаг 1 Включил cdn вроде
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src = "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
Код Шаг 2 Нравится
$(document).ready(function(){
$("#submit").click(function () {
$('#myform').validate({ // initialize the plugin
rules: {
id: {
required: true,
email: true
},
password: {
required: true,
minlength: 1
}
},
messages: {
id: {
required: "Enter Email Id"
},
password: {
required: "Enter Email Password"
}
},
submitHandler: function (form) { // for demo
alert('valid form submitted'); // for demo
return false; // for demo
}
});
}):
});
95 голосов, я думаю, это означает, что документация bassistance.de/jquery-plugins/jquery-plugin-validation может быть неясной: P