Показать сообщение отдельно
  #1 (permalink)  
Старый 26.02.2019, 23:19
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Видимо чего-то я не знаю, либо ...
Родительскому блоку (объявлен в глобальной переменной) делегируется обработка полей типа 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.
Ответить с цитированием