@SLR722sss

Как сделать сортировку товаров AJAX в Bitrix, не используя настройку ajax для компонента каталога?

Сейчас сортировка работает на основе GET-параметров с перезагрузкой страницы, сделал скрипт который делает сортировку методом jquery.load то есть товары подтягиваются на страницу идя по урлу с гет-параметрами, при этом страница не перезагружается.

Проблема в том что после такой аякс подгрузки не работают скрипты на карточках в списке, то есть не работает выбор количества и кнопка покупки...

Есть какой то другой способ сделать аякс сортировку в битриксе или может кто знает какую js функцию можно запустить после завершения аякса чтобы обновить скрипты для карточек?
  • Вопрос задан
  • 2141 просмотр
Решения вопроса 1
@PetrPo
В section.php надо сделать RestartBuffer
В ответе ajax
var ob = BX.processHTML(data);
BX.ajax.processScripts(ob.SCRIPT);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Проблема в том что после такой аякс подгрузки не работают скрипты на карточках в списке, то есть не работает выбор количества и кнопка покупки...

Проблема не в этом. Вот только вчера ругался с верстальщиком - проблема в том что вы используете jquery и ajax - не надо так. Точнее можно, но очень оккуратно, понимая что происходит.
А в прниципе они противопоказаны друг-другу, потому что ajax обновляет DOM, а jquery работает с событиями которые навешиваются на элементы DOM.

Решния такие:
1 Самое простое - перевесить все события на document или body. Ну т.е. у вас есть скрпит какой-то который навешен на '.baybutton' скажем как-то так$('.baybutton').click Меняете его на $(document).on(.baybutton','click'' или как-то так. Соотвественно, когда вы заменете ajax'ом эту кнопку, событие на ней останется, так как висит на документе.

2 Посложнее, но аккуратнее - добавляейте элементам отдельные селекторы и вешайте события на них через вызов специальной функции, удаляя после навешивания эти селекторы. Вызывайте функцию навешивания, после готовности страницы и после каждого обновления ajax. Для этого есть смысл написать отдельный диспетчер ajax, и пропускать все вызовы через него.

И да - битрикс тут не при чем.
Ответ написан
@RuComMarket
Битрикс FullStack разработчик
если событие вешается на элемент, то оно вешается на существующий элемент, и не работает на вновь подгруженном через ajax, необходимо событие повесить на статичный родительский элемент или весь документ.
$({родительский элемент}).on({событие},{элемент события},function(event){...});
Если вешаете на документ, надо учитывать что обрабатываться будут все указанные элементы, если на родительский элемент, то отрабатываются, только те элементы, которые находятся внутри родительского.
В таком варианте события будут работать на новые подгруженные ajax'ом объекты.
Сортировку и прочие параметры проще передавать POST'ом, это как минимум удобнее, особенно когда в обработке учитываете фильтрацию и пагинацию (думаю в дальнейшем с этим столкнетесь)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы