У меня есть валидация с помощью регулярки, где я проверяю совпадают ли условия с введенными данными. Сейчас показан пример где нужно ввести логин длинной от 3 до 16 символов. И в случае чего добавлять bootstrap классы danger или success (Изначально ничего нет). Только вот схема получилась очень большая, я пытался сделать ее еще меньше заранее удаляя определенный класс. Только вот удалить его js не дает если он не существует. А иначе схема просто не работает. Вот код
$('#login').keyup(function(){
//Проверяем длинну логина
var str = $(this).val();
var result = str.search(/^[a-z0-9_-]{3,16}$/);
if(result != 0){
if($('#login_lenght_rule').hasClass('list-group-item-success')){
$('#login_lenght_rule').removeClass('list-group-item-success');
$('#login_lenght_rule').addClass('list-group-item-danger');
}
else{
$('#login_lenght_rule').addClass('list-group-item-danger');
}
}
else{
if($('#login_lenght_rule').hasClass('list-group-item-danger')){
$('#login_lenght_rule').removeClass('list-group-item-danger');
$('#login_lenght_rule').addClass('list-group-item-success');
}
else{
$('#login_lenght_rule').addClass('list-group-item-success');
}
}
return false;
});
Пришлось добавить еще 2 условия которые проверяют существует ли определенный класс, помогите пожалуйста, можно ли сделать эту схему не такой громоздкой. Заренее спасибо)
Попробую с простого:
Для начала один и тот же селектор $('#login_lenght_rule')
запишем в переменную, чтобы каждый раз не дергать регулярки внутри Jquery. А также, заметим, что в условиях есть повторяющиеся места: внутри первого - всегда добавляется класс list-group-item-danger
, вне зависимо от условия, в другом - list-group-item-success
. Это упрощается до такого условия:
let loginField = $('#login_lenght_rule');
if(result != 0){
if(loginField.hasClass('list-group-item-success'))
loginField.removeClass('list-group-item-success');
loginField.addClass('list-group-item-danger');
} else {
if(loginField.hasClass('list-group-item-danger'))
loginField.removeClass('list-group-item-danger');
loginField.addClass('list-group-item-success');
}
removeClass
сработает без ошибок, даже если класса нет в элементе, поэтому проверка на hasClass
в данном случае не нужна. Получаем:
let loginField = $('#login_lenght_rule');
if(result != 0){
loginField.removeClass('list-group-item-success');
loginField.addClass('list-group-item-danger');
} else {
loginField.removeClass('list-group-item-danger');
loginField.addClass('list-group-item-success');
}
Всё свелось к тому, что мы просто при условии один класс удаляем, другой добавляем. Это можно вынести в функцию и вызывать её. А if
заменить тернарником:
let loginField = $('#login_lenght_rule');
result != 0
? switchElementClass(loginField, 'list-group-item-success', 'list-group-item-danger')
: switchElementClass(loginField, 'list-group-item-danger', 'list-group-item-success');
function switchElementClass(el, from, to) {
$(el).removeClass(from).addClass(to);
}
У Jquery есть метод toggleClass, который уже делает подобный функционал. У него в методе первым параметром можно написать класс, который нужно переключать, а вторым - булево значение, которое определяет включить класс или удалить. Как итог, всё можно свести к этому:
let loginField = $('#login_lenght_rule');
loginField.toggleClass('list-group-item-success', result === 0);
loginField.toggleClass('list-group-item-danger', result !== 0);
Рабочий пример:
$('#login').keyup(function(){
//Проверяем длинну логина
var str = $(this).val();
var result = str.search(/^[a-z0-9_-]{3,16}$/);
let loginField = $('#login_lenght_rule');
loginField.toggleClass('list-group-item-success', result === 0);
loginField.toggleClass('list-group-item-danger', result !== 0);
});
.list-group-item-success {
color: green;
}
.list-group-item-danger {
color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<input type="text" id="login">
<div id="login_lenght_rule">Текст</div>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В Java есть функцияsplit которая разделяет строку вокруг регулярного выражения и возвращает массив строк, так вот есть ли в C++ (стандартной библиотеке)...
Пытаюсь подключиться к базе данных, созданной через Visual Studio (Средства -> Подключиться к базе данных)