Заметил интересную особенность - первый раз в шаблоне компонента bitrix_sessid_post() возвращает инлайновый JS (методом CAjax::GetForm()):
Код |
---|
<script type="text/javascript">
function _processform_8BACKi(){
var obForm = top.BX('bxajaxid_fe571071dce39e827fbb194d5f20cc59_8BACKi').form;
top.BX.bind(obForm, 'submit', function() {BX.ajax.submitComponentForm(this, 'comp_fe571071dce39e827fbb194d5f20cc59', true)});
top.BX.removeCustomEvent('onAjaxSuccess', _processform_8BACKi);
}
if (top.BX('bxajaxid_fe571071dce39e827fbb194d5f20cc59_8BACKi'))
_processform_8BACKi();
else
top.BX.addCustomEvent('onAjaxSuccess', _processform_8BACKi);
</script>
|
После submit'a эта функция ничего не возвращает. То есть компонент вызванный AJAX-ом в шаблоне не отдает инлайновый скрипт.
Получается, что скрипт генерируется по следующей цепочке:
$APPLICATION->IncludeComponent() - просто передает параметры вызываемого компонента
CComponentAjax::Process() - вызывается, если в массиве $arParams есть ключ AJAX_MODE == "Y", у меня в обоих случаях он остается таким
CComponentAjax::_PrepareData() - готовит данные для работы компонента. Есть интересные отличия между первым (в теле страницы) и вторым (в виде AJAX-запроса) вызовом компонента:
| В теле страницы | В виде AJAX-запроса |
bAjaxSession | false | true |
bIFrameMode | false | true |
buffer_start_counter | 22 | 0 |
buffer_finish_counter | 23 | 1 |
Именно в этой функции и продает нужный скрипт - все дело в новом значении blFrameMode:
Смотрим /modules/main/classes/general/component_ajax.php
Код |
---|
if ($this->bIFrameMode)
{
$this->__PrepareScripts($data);
// fix IE bug;
$data = '<html><head></head><body>'.$data.'</body></html>';
}
|
Скрытый текст |
---|
Странно, почему для фикса бага в IE не используется стандартная для битрикса функция IsIE()... |
CComponentAjax::__PrepareForms() - готовит данные для вывода, то есть после исполнения template.php преобразует данные в нужный вид, в том числе с помощью
CAjax::GetForm. Что интересно - на обоих хитах возвращает одинаковый код, то есть выполняется одинаково, не зависимо от способа вызова - внутри обычной страницы или в составе AJAX-запроса.
CAjax::GetForm() - функция переделывает код из шаблона компонента из такого:
Код |
---|
<form id="..." action="/temp.php" method="POST">
|
В такой:
Код |
---|
<form id="..." action="/temp.php" method="POST"><input type="hidden" name="bxajaxid" id="bxajaxid_fe571071dce39e827fbb194d5f20cc59_8BACKi" value="fe571071dce39e827fbb194d5f20cc59" /><input type="hidden" name="AJAX_CALL" value="Y" /><script type="text/javascript">
function _processform_8BACKi(){
var obForm = top.BX(\'bxajaxid_fe571071dce39e827fbb194d5f20cc59_8BACKi\').form;
top.BX.bind(obForm, \'submit\', function() {BX.ajax.submitComponentForm(this, \'comp_fe571071dce39e827fbb194d5f20cc59\', true)});
top.BX.removeCustomEvent(\'onAjaxSuccess\', _processform_8BACKi);
}
if (top.BX(\'bxajaxid_fe571071dce39e827fbb194d5f20cc59_8BACKi\'))
_processform_8BACKi();
else
top.BX.addCustomEvent(\'onAjaxSuccess\', _processform_8BACKi);
</script>
|
И что ... характерно - исправно на обоих хитах!
CComponentAjax - /bitrix/modules/main/classes/general/component_ajax.php
CAjax - /bitrix/modules/main/ajax_tools.php
P.S. Так скоро все потроха от Ajax-а достану(
P.P.S. Расковырял весь Ajax, но дело не в скрипте, который удаляется на второй хит. Другие компоненты нормально работают и без него.
P.P.P.S. Проблема была в скрипте всплывающего окна, который изменял DOM - то есть добавлял свои элементы для создания всплывающего окна, в следствии чего BX.bind становился беспомощным, т.к. не обновляется вместе с DOM.