Nubware
@Nubware
Нуб – он и в Африке нуб.

JQuery: Как добавить класс динамически созданному элементу, если смежное с ним текстовое поле не является пустым?

Здравствуйте!

Имеется блок со следующей структурой:

<span class="input input_has-clear">
   <span class="input__box">
      <input class="input__control" type="text" value="">
   </span>
</span>


Необходимо после .input__control добавить новый элемент с классом .input__clear. При вводе данных в текстовое поле к динамически созданному элементу .input__clear нужно добавить дополнительный класс .input__clear_visible и удалить данный класс, если поле становится пустым.

Задачу решаю так:

$(function() {
   // Добавляем новый элемент
   $(".input_has-clear").append("<i class='input__clear'>");

   // Если поле не является пустым
   if($(".input_has-clear").val() != "") {
      // Добавляем/удаляем класс
      $(this).find(".input__clear").toggleClass("input__clear_visible");
   }
});


Проблема в том, что первая строка с добавлением элемента прекрасно работает, а вот условие выполняться не хочет, как его ни крутил: были попытки оборачивать услевие в события change и focus. Не подскажете, как решить задачу? Сам пока постигаю "азы", собирая собственную CSS-библиотеку компонентов на основе БЭМ.

Спасибо!
  • Вопрос задан
  • 1306 просмотров
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Корректный код:
$(".input_has-clear").append("<i class='input__clear'>x</i>");

// Ставим обработчик на событие изменения поля
$('.input__control').on('change', function () {
    // Находим родительский блок
    $(this).closest('.input_has-clear')
        // в родительском блоке находим нужный элемент
        .find(".input__clear")
        // скрываем или показываем элемент в зависимости от заполненности поля
        // обратите внимание, что toggleClass вторым аргументом принимает чисто булевое значение
        // поэтому при помощи двойного отрицания приводим строку к нему
        // если она пустая - будет false и класс уберется, иначе - добавится
        .toggleClass("input__clear_visible", !!$(this).val());
});

jsfiddle.net/koceg/j40vquoo

В вашем коде очень многое неверно:
$(function() {
   $(".input_has-clear").append("<i class='input__clear'>");

   // 1. Этот код выполнится один раз при загрузке страницы,
   // вам же, наверняка, нужно, чтобы элемент скрывался или показывался
   // динамически по мере редактирования поля
   // 2. .input_has-clear - это span, у него нет value
   if($(".input_has-clear").val() != "") {
      // Логика определения скрытия и показа класса неверная
      // Если повесить на поле обработчик, то при вводе каждой буквы
      // Элемент будет то скрываться, то показываться
      $(this).find(".input__clear").toggleClass("input__clear_visible");
   }
});


P.S.
цикл выполняться не хочет
В вашем коде нет ни одного цикла.
Ответ написан
Как вариант вот так
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы