Видимо чего-то я не знаю, либо ...
Родительскому блоку (объявлен в глобальной переменной) делегируется обработка полей типа number следующих событий - "input keyup change", а также "focusin" и "focusout".
Поле имеет дата-атрибуты - количество товара в корзине 0/N, и минимальное количество для заказа - всегда не менее 1. Рядом с полем кнопка добавления в корзину - button, имеющая значением ID товара. При загрузке страницы и выводе списка, если значение поля устанавливается равным значению в корзине. Если оно равно 0, то button disabled = true, иначе disabled = false и кнопке добавляется класс "add".
Обработчик первых трех событий обрабатывает ручной ввод и определяет доступность кнопки по условию:
если кнопка имеет класс "add" || значение поля > 0 && значение поля >= минимального значения для заказа, то disabled равна false, иначе true.
Почему условие проверяет и по классу - дело в том, что при добавлении в корзину при изменении количества, если оно будет 0, то кнопка становится недоступной. А для товаров уже имеющихся в корзине, можно установить значение равной 0, чтобы иметь возможность удалить товар из корзины.
После этой операции по триггеру события "focusin" управление передается обработчику этого события. Этот обработчик выводит у поля таблицу расчета:
показывается информация для поля - если товара не в корзине, то при наборе текст "Для корзины". Если товар уже в корзине, то отображается и второй текст отображающий его состояние в корзине, а при наборе первый текст имеет сообщение "Изменить в корзине".
Два текста или один, и что будет выводить первый текст также определяется по условию:
если дата-атрибут "в корзине" не 0 && значение поля != дата-атрибуту "в корзине", это это изменение в корзине, иначе набор для корзины.
Все работает как и положено, если страница загружена, и с товарами в корзине, и с не добавленными.
По асинхронным запросам добавления товара в корзину (изменения в корзине) сервер отвечает, и его ответ обрабатывается - по возвращенному ID, находится кнопка источник запроса и ее сосед - поле ввода, которым производится установка следующих параметров (все из данных ответа):
1) в дата-атрибут "в корзине" и значению поля возвращенное значение добавленного/измененного - выполняется.
2) в зависимости от возвращенного значения добавленного/измененного убирается или добавляется класс "add" кнопке - выполняется.
3) 2) в зависимости от возвращенного значения добавленного/измененного устанавливается disabled true/false не выполняется.
И как я только не пытался установить этот disabled, бесполезно.
А так как не выполняется 3), то соответственно можно выполнять запросы неконтролируемые. И не смотря на то, что в дата-атрибут "в корзине" производится запись изменений, значение поля также изменяется, тексты в таблице расчетов отображаются не те. То есть перестают работать условия.
Обработчики работают, делегирование, а что не так после смены значений у элементов?
PS. Неужто при смене значений они не будут равны тем, которые были у элемента на момент установки обработчика и надо переписать DOM элементы?
Последний раз редактировалось laimas, 26.02.2019 в 23:35.
|