Простая смена классов JS

100
09 марта 2021, 12:20

У меня есть валидация с помощью регулярки, где я проверяю совпадают ли условия с введенными данными. Сейчас показан пример где нужно ввести логин длинной от 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 условия которые проверяют существует ли определенный класс, помогите пожалуйста, можно ли сделать эту схему не такой громоздкой. Заренее спасибо)

Answer 1

Попробую с простого:

  1. Для начала один и тот же селектор $('#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'); 
    }
    
  2. 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'); 
    }
    
  3. Всё свелось к тому, что мы просто при условии один класс удаляем, другой добавляем. Это можно вынести в функцию и вызывать её. А 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);
    }
    
  4. У 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>

READ ALSO
Разделить строку на массив слов c++

Разделить строку на массив слов c++

В Java есть функцияsplit которая разделяет строку вокруг регулярного выражения и возвращает массив строк, так вот есть ли в C++ (стандартной библиотеке)...

95
Подключение локальной БД из файла на С++

Подключение локальной БД из файла на С++

Пытаюсь подключиться к базе данных, созданной через Visual Studio (Средства -> Подключиться к базе данных)

102
Помогите понять различия

Помогите понять различия

У меня есть два класса:

104