Возможность указать свою javascript-функцию, которая вызовется после обновления области Аяксом

Рейтинг: 36.2723  
Новая
Предложил Зайцев Артемий 22.01.2013 19:52:15

Возможность указать свою javascript-функцию, которая вызовется после обновления области Аяксом

В компоненте с ajax требуется после обновления области вызвать функцию javascript, которая раскрасит таблицу и вызовет плагины jQuery.

В функции BX.ajax.submitComponentForm(форма, элемент, показывать_колесико_загрузки ); необходимо добавить четвертый параметр  "callback_function" - имя функции обратного вызова.

В форму к настройкам Аякса стандартного компонента добавить поле "Имя javascript-функции для вызова после обновления области".

Эти маленькие улучшения в будущем позволят в любом компоненте, где включен Аякс вызывать свою функцию для обновления области. В том числе для компонента корзины на Аякс.

Рейтинг: 7.9762  
Зайцев Артемий 22.01.2013 20:22:19
Конкретный пример:

Вот код, который делает таблицу красивой. Назначает обработчики событий на наведение мышкой.

Что внутри плагина jquery, я не знаю, и не должен знать. Такой код я получил от фронт-енд программиста и не трогаю. Переписать в стиле <div on mouseover="func();"> возможности нет.

jquery(docu ment).ready(f unction() {
   $( ".storeitems" ).fixedtableheader({
       highlightrow: true,
       highlightclass: 'hover'
   });
});

В компоненте формы заказа на ajax нет возможности вызвать свой обработчик после обновления области.
Рейтинг: 7.007  
Антон Пилецкий 24.01.2013 21:35:33
Есть решение в виде:
<img src="1px.gif" on load="myinitfuntion();"> 
Хардкор, но работает исправно.
Но лучше было бы как описано в идее, да.
Рейтинг: 0  
Гребнев Алексей 31.01.2013 12:45:17
А почему не заменить на BX.ajax.submit?
Рейтинг: 1.0703  
Зайцев Артемий 31.01.2013 15:19:27
Тогда лучше jQuery.ajax.

Я не рискну у клиента на проекте применять недокументированную  BX.ajax.submit. Как-то не хочется, чтобы клиент боялся обновляться.

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

О необходимости документации идею уже предлагал
Рейтинг: 9.7017  
Bender-nvkz 03.05.2013 11:02:10
Всем привет. Похожая проблема была.
Решается вызовом BX.addCustomEvent с параметром события onAjaxSuccess, а второй параметр - имя нужной функции.

в ведре нашел:
BX.addCustomEvent(eventObject, eventName, eventHandler) - set custom event handler for particular object
BX.addCustomEvent(eventName, eventHandler) - set custom event handler for all objects

Мой наглядный пример:
У меня дизайнерские инпуты, создаются функцией Custom.init.
При оформлении заказа и выборе способа доставки, естественно работает BX.ajax.submitComponentForm в шаблоне компонента.
Инпуты создаются при загрузке: window.on load = Custom.init;
Но, при смене способа доставки, происходит обновление формы, и дизайнерские инпуты соответственно пропадают, так как обновляется DOM, и Custom.init к новым созданным - не применяется.
Т.е. нужно выполнить Custom.init по окончании BX.ajax.submitComponentForm.
Так вот нашел BX.addCustomEvent(eventName, eventHandler), и написал в script.js для шаблона:
$(document).ready(function() {                                                          
BX.addCustomEvent('onAjaxSuccess', Custom.init);    
});
Рейтинг: -0.2828  
Зайцев Артемий 03.05.2013 11:42:44
А в случае ошибки какое событие вызывается?
Рейтинг: -0.2828  
Bender-nvkz 03.05.2013 14:40:30
onAjaxFailure :D
Рейтинг: 0  
Ситников Артем 03.02.2014 16:22:40
Ух, как вы мне помогли, я уже такие костыли крутил....
Рейтинг: 0.8902  
Ипатов Дмитрий 19.03.2014 12:53:55
Идея верная, тк
BX.addCustomEvent('onAjaxSuccess', afterFormReload); 

будет возвращаться для других ajax функций битрикса, например модуль pull.

так что пришлось перекрывать BX.ajax.submitComponentForm
своей с флагом                            
               // Добавил флаг
               BX.onCustomEvent('onAjaxSuccess', ['flag1',null,callOnload]);
 

         function afterFormReload(data) {
            // проверка флага
            if (data == 'flag1')
            {
               // код
            }
         }
костыли!