Уже с давних пор использую отличную связку всплывающих окон и аякс битрикса. В основном для авторизации или каких-то подобных простых действий. И как оказалось, что не сталкивался с подобной проблемой. А проблема заключается в следующем:
Есть веб-форма, которая должна появляться во всплывающем окне и обрабатываться без перезагрузки. Сказано - сделано. Вывел компонент, проставил AJAX_MODE, завернул в скрытый div и запустил с функциоей $.fancybox. До этого момента всё отлично работает. Интересное начинается дальше - после того как форма отработала и вернула результат - список ошибок или сообщение, индикатор загрузки добавленный в конец документа не удаляется.
Такая странность поведения сразу же заложила во мне сомнение в собственном коде и какое-то время пытался доказать это. В итоге поняв, что я не виноват, а проблему надо быстрее решать пошел по привычке читать код и выводить промежуточную информацию.
Выяснилось, что функция "submitComponentForm" из core_ajax.js вызывается дважды и что самое ужасное второй вызов создаёт индикатор загрузки не прикрепленный к DOM. Это поведение, кстати, не происходит когда форма не выводится через fancybox и важно отметить. Важно отметить как работает плагин fancybox, он переносит необходимую ветку из DOM и вставляет её в свой контейнер. И тут необходимо знать, что находится в переносимой ветке - потому что если это javascript тогда он вызовится снова! А это как видно - чревато. И как раз со стороны битрикса джаваскрипт как раз и вставляется, меня интересует в этом случае, вот эта строчка:
BX.bind(obForm, \'submit\', function() {BX.ajax.submitComponentForm(this, \'comp_db7274a13d33a29d0198a245680e08ba\', true)})
Думаю не стоит объяснять, дальше смысл этого странного поведения. Увы дальнейшие попытки подружить fancybox с битриксом не увенчались успехом и бороться с утечками памяти тоже не хотелось, ведь если забыть очистить лишние обработчики - какой-то зловещий тестер нажав 100500 раз кнопку отправки мог бы загрузить свой браузер, а мне бы этого не хотелось бы допустить Тогда и было решено сделать своё простое всплывающее окошко, без манипуляций с DOM, что и решило эту неприятность.
Есть веб-форма, которая должна появляться во всплывающем окне и обрабатываться без перезагрузки. Сказано - сделано. Вывел компонент, проставил AJAX_MODE, завернул в скрытый div и запустил с функциоей $.fancybox. До этого момента всё отлично работает. Интересное начинается дальше - после того как форма отработала и вернула результат - список ошибок или сообщение, индикатор загрузки добавленный в конец документа не удаляется.
Такая странность поведения сразу же заложила во мне сомнение в собственном коде и какое-то время пытался доказать это. В итоге поняв, что я не виноват, а проблему надо быстрее решать пошел по привычке читать код и выводить промежуточную информацию.
Выяснилось, что функция "submitComponentForm" из core_ajax.js вызывается дважды и что самое ужасное второй вызов создаёт индикатор загрузки не прикрепленный к DOM. Это поведение, кстати, не происходит когда форма не выводится через fancybox и важно отметить. Важно отметить как работает плагин fancybox, он переносит необходимую ветку из DOM и вставляет её в свой контейнер. И тут необходимо знать, что находится в переносимой ветке - потому что если это javascript тогда он вызовится снова! А это как видно - чревато. И как раз со стороны битрикса джаваскрипт как раз и вставляется, меня интересует в этом случае, вот эта строчка:
BX.bind(obForm, \'submit\', function() {BX.ajax.submitComponentForm(this, \'comp_db7274a13d33a29d0198a245680e08ba\', true)})
Думаю не стоит объяснять, дальше смысл этого странного поведения. Увы дальнейшие попытки подружить fancybox с битриксом не увенчались успехом и бороться с утечками памяти тоже не хотелось, ведь если забыть очистить лишние обработчики - какой-то зловещий тестер нажав 100500 раз кнопку отправки мог бы загрузить свой браузер, а мне бы этого не хотелось бы допустить Тогда и было решено сделать своё простое всплывающее окошко, без манипуляций с DOM, что и решило эту неприятность.