Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Исп. селектора filter для вызова плагина (https://javascript.ru/forum/jquery/58135-isp-selektora-filter-dlya-vyzova-plagina.html)

IONEX 06.09.2015 20:02

Исп. селектора filter для вызова плагина
 
Добрый вечер!
Задача создать форму регистрации в которой присутствуют как поля ввода, так и списки с выбором региона/страны. На данном этапе реализую обработку введенных данных.

$('input').bind('keyup change',function(){
        //Если измененное поле не пустое, то:
        if ($(this).val() !== ''){
            $(this).check_input();
            $(this).filter('.login.enebled').check_login();
            $(this).filter('.password_retype').check_password_retype();
        }
    });


Создал плагин check_input, который общий для всех полей ввода + плагины с доп. проверкой, которые должны запускаться только для соотв. класса - check_password_retype и др.

Вопрос такой: при использовании filter ожидаю, что поле ввода которое не имеет соотв. класс отфильтруется и плагин не будет выполнен, но в результате выполняются все плагины по очереди. Какие пути решения?

+ дополнительный вопрос.
Процедура срабатывает два раза по keyup (необходимо для полей ввода) и change (необходимо для списков). Пока не критично, но как сделать чтобы процедура срабатывала по keyup и не работала по change?

рони 06.09.2015 21:06

IONEX,

попробуйте так
$('input').on('input',function(){
        //Если измененное поле не пустое, то:
        if ($.trim(this.value)){
            $(this).check_input();
            $(this).filter('.login.enebled').check_login();
            $(this).filter('.password_retype').check_password_retype();
        }
    });


Цитата:

Сообщение от IONEX
Вопрос такой: при использовании filter ожидаю, что поле ввода которое не имеет соотв. класс отфильтруется и плагин не будет выполнен, но в результате выполняются все плагины по очереди.

а неизвестно как ваши плагины устроены - если вы три плагина запускаите, то почему они не должны сработать?

BETEPAH 06.09.2015 23:29

Цитата:

Сообщение от IONEX
при использовании filter ожидаю, что поле ввода которое не имеет соотв. класс отфильтруется и плагин не будет выполнен

это неправильное ожидание. Плагин выполнится в любом случае после filter. Просто в случае неподходящего класса плагин на входе получит объект нулевой длины.
http://jsfiddle.net/1xe4ea45/
Проверяйте длину в начале плагина и делайте return если она нулевая. Или лучше вместо фильтра использовать более очевидное if($(this).hasClass('password_retype') {}
ИМХО :)

IONEX 06.09.2015 23:59

Благодарю за ответы!

Цитата:

Сообщение от BETEPAH (Сообщение 387375)
это неправильное ожидание. Плагин выполнится в любом случае после filter. Просто в случае неподходящего класса плагин на входе получит объект нулевой длины.
http://jsfiddle.net/1xe4ea45/
Проверяйте длину в начале плагина и делайте return если она нулевая.
ИМХО :)

Почти так и сделал:
if (this.val() === undefined){
            return;
        }

Что касается if, то основной код, как мне кажется, получится сильно громоздким если в каждом if будет около 15 строк. Поэтому стараюсь все сделать с использованием плагинов и процедур, да, и править легче.

Рони, Ваш совет также помог - с input все работает!

Еще раз, всем спасибо!;)

laimas 07.09.2015 02:08

Цитата:

Сообщение от IONEX
if (this.val() === undefined){
return;
}

Что касается if, то основной код, как мне кажется, получится сильно громоздким если в каждом if будет около 15 строк.

Это в чем так можно сделать - this.val()?

if(!$.trim(this.value)) return;

а проверить наличие объекта, это

if(!$('selector').length) return;

Единственный retun в условии при наличии фигурных скобок, это уже два лишних байта, да еще переход на строки...


Часовой пояс GMT +3, время: 06:51.