Javascript.RU

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

Видимо чего-то я не знаю, либо ...
Родительскому блоку (объявлен в глобальной переменной) делегируется обработка полей типа 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 в 22:35.
Ответить с цитированием
  #2 (permalink)  
Старый 26.02.2019, 23:24
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,119

Если речь о методе .data(), то он снимает данные с дата-атрибута только первый раз, здесь написано.
Ответить с цитированием
  #3 (permalink)  
Старый 26.02.2019, 23:26
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 10,643

Да, темный я, это уже другие DOM.
Ответить с цитированием
  #4 (permalink)  
Старый 26.02.2019, 23:28
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 10,643

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

Он не первый раз снимает, а берет из атрибута всегда до тех пор, пока не будет установлены объекту данные методом .data(), тогда он будет оперировать ими.
Ответить с цитированием
  #5 (permalink)  
Старый 26.02.2019, 23:33
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,119

Если другие, то прав наверное.
Ответить с цитированием
  #6 (permalink)  
Старый 26.02.2019, 23:47
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 10,643

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

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


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
событие происходит либо с несколькими либо не содним happy_Mikhail jQuery 3 10.12.2015 09:09
С чего начать изучение!? RGBPlus Учебные материалы 3 14.02.2014 13:15
Backbone, либо сам JS, либо я p00h Общие вопросы Javascript 2 26.08.2011 08:27
Firefox - все отлично, CHROME/IE - не знаю с чего начать Pumych (X)HTML/CSS 3 16.02.2011 09:03
Превьювер - подскажите с чего начать? Travolta Общие вопросы Javascript 1 07.02.2010 13:22