Задача заключалась в исправлении некорректной работы корзины на сайте. По сути, 3декор – один большой каталог, то есть каждый элемент сайта автоматически синхронизируется с корзиной. Прим загрузке любой страницы сайта, содержащей товары, или товар, присутствует поле input, в котором выводится колличество данного товара, которое уже содержится в корзине, слева и справа от этого поля – кнопки + и -. При вводе числа в поле товар в заданном количестве автоматически добавляется в корзину, так же можно добавлять/отнимать клавишами + и -.

 

3dekor-korzina-opencart (2)

 

3dekor-korzina-opencart

 

Изначально был написан простенький скрипт, выполняющийся при изменении поля, либо по нажатию на +/-, после чего мы получили это

 

22

Посмотрел подробнее. Клавиши работают через раз. Если добавлять/отнимать с интервалом в пол секунды, все работает идеально. Если барабанить по клавишам – начинаются глюки. Пересмотрел функцию – все нормально. Сначала грешил на анимацию значка корзины:

Закомментировал – ноль реакции. Самым плохим решением проблеммы стало:

В начале скрипта и

В конце, то есть клавиша отключалась на пол секунды. Стало лучше, но глюки все равно проскакивали. То же самое творилось и с input.

Итак, решение. Я влез в стандартные функции добавления в корзину, которые вызывались из checkout/cart через ajax, и всю функцию перенес на место коммнды AddToCart, и в success вставил «включение» кнопки. Получилось:

‘ + json[‘success’] + ‘

Все заработало идеально, кроме ввода от руки. Для этого была использована старая добрая рекурсия. В скрипт TryToAdd(), выполняемый по onkeyup в начало добавил выключение этого onkeyup, а в success после добавления в корзину – вызов функции ControlField(), которая проверяла изменение поля после последнего вызова. Код: