Если возвращает всегда true и проверьте каждый элемент с has ()

0

В фокусе ввода я хочу проверить, не имеет ли класс msg класса err с ним, а затем что-то делать. Я попробовал его со следующим кодом, но if-statement всегда возвращает true.

JQuery

$('form .field input').on('focus blur', function(e){
    if($(this).parent().find('.msg').parent().not(':has(.err)')) {
        $(this).parent().find('.msg').parent().stop()[e.type === 'focus' ? 'slideDown' : 'slideUp']();
    }
})

Затем я хочу также проверить каждый класс msg, который также имеет класс err. И если есть только 1, я хочу выбрать вход в родительском.

Это моя попытка, но это не сработало.

if($('.msg').parent('.field').has('.err').length === 1) {
    $(this).parents().find('input').select();
}

HTML

<div class="field">
    <input type="text">
    <div>
        <div class="msg">Msg.</div>
    </div>
</div>
<div class="field">
    <input type="text">
    <div>
        <div class="msg err">Err msg.</div>
    </div>
</div>
Теги:

2 ответа

2
Лучший ответ

.not() не возвращает логическое значение типа .is(). Это противоположность .filter(). Возвращенная коллекция всегда оценивается как правдивая.

if ($(this).parent().find('.msg').parent().not(':has(.err)')) {

должно быть:

if (!$(this).parent().find('.msg').parent().is(':has(.err)')) {
//  ^ not                                   ^^ returns boolean
0

Использовать hasClass

$('form .field input').on('focus blur', function(e){
    if(!$(this).parent().find('.msg').parent().hasClass('err')) {
        $(this).parent().find('.msg').parent().stop()[e.type === 'focus' ? 'slideDown' : 'slideUp']();
    }
})

if($('.msg').parent('.field').hasClass('err')) {
    $(this).parents().find('input').select();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню