Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Видимо чего-то я не знаю, либо ... (https://javascript.ru/forum/jquery/76917-vidimo-chego-ya-ne-znayu-libo.html)

laimas 26.02.2019 23:19

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

Rise 27.02.2019 00:24

Если речь о методе .data(), то он снимает данные с дата-атрибута только первый раз, здесь написано.

laimas 27.02.2019 00:26

Да, темный я, это уже другие DOM. :)

laimas 27.02.2019 00:28

Цитата:

Сообщение от Rise
Если речь о методе .data() ...

Да вообще это уже другие объекты получаются - заменил их и все работает. Или я все же не прав?

Он не первый раз снимает, а берет из атрибута всегда до тех пор, пока не будет установлены объекту данные методом .data(), тогда он будет оперировать ими.

Rise 27.02.2019 00:33

Если другие, то прав наверное.

laimas 27.02.2019 00:47

Цитата:

Сообщение от Rise
Если другие, то прав наверное.

Не знаю, но поведение такое указывает на то, что он сравнивает value, берет состояние disabled элемента до изменения этих свойств. Значит новый уже элемент получается. Я то всегда считал так - заменили сам DOM элемент, вот это новый, но чтобы заменить у динамически добавляемого элемента значение и он стал другим...

В общем клонировал, перезаписал ими, и работает.


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