Дата последнего изменения: 30.09.2017
Пример "моргания": счетчик товаров в корзине пользователя находится в динамической области. Некрасиво прыгает цифра: сначала ноль, потом один. Почему это происходит?
Чтобы побороть "моргание", нужно вставить актуальные данные в страницу до того, как она покажется пользователю. Как вставить до рендеринга? есть два варианта:
<!doctype html> <html> <body> <div id="box" style="width: 100px; height: 100px; background: red;"></div> <script>document.getElementById("box").style.background = "blue";</script> <table><tr><td>some html below</td></tr></table> </body> </html>>
Есть вероятность нарваться на Exception, поэтому можно подстраховаться:
function changeBox() { document.getElementById("box").style.background = "blue"; } var box = document.getElementById("box"); if (box) { changeBox(); } else { BX.ready(function() { changeBox(); }); }
Актуальные данные можно получить из:
Самый приемлемый вариант - это localStorage. Это key-value хранилище, которое поддерживается всеми браузерами, даже IE8. Данные localStorage доступны мгновенно сразу во всех вкладках. То есть, если у пользователя открыто 10 вкладок магазина и он в одной из них жмет "Добавить в корзину", то через событие localStorage'а можно мгновенно поменять во всех вкладках счетчик корзины.
Для localStorage в Bitrix Framework есть своя обвязка под названием BX.localStorage. Она позволяет указывать время хранения данных. Основные методы:
События:
В итоге: счетчик корзины и имя пользователя можно кешировать в localStorage и использовать эти данные для борьбы с "морганием".
Что ещё нужно учитывать чтобы избежать "моргания":