Заметил интересную особенность - первый раз в шаблоне компонента bitrix_sessid_post() возвращает инлайновый JS (методом CAjax::GetForm()):
[CODE]<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>
[/CODE]
После submit'a эта функция ничего не возвращает. То есть компонент вызванный AJAX-ом в шаблоне не отдает инлайновый скрипт.
Получается, что скрипт генерируется по следующей цепочке:
[B]$APPLICATION->IncludeComponent()[/B] - просто передает параметры вызываемого компонента
[B]CComponentAjax::Process()[/B] - вызывается, если в массиве $arParams есть ключ AJAX_MODE == "Y", у меня в обоих случаях он остается таким
[B]CComponentAjax::_PrepareData()[/B] - готовит данные для работы компонента. Есть интересные отличия между первым (в теле страницы) и вторым (в виде AJAX-запроса) вызовом компонента:[TABLE][TR][TD][/TD][TD]В теле страницы[/TD][TD]В виде AJAX-запроса[/TD][/TR][TR][TD]bAjaxSession[/TD][TD]false[/TD][TD]true[/TD][/TR][TR][TD]bIFrameMode[/TD][TD]false[/TD][TD]true[/TD][/TR][TR][TD]buffer_start_counter[/TD][TD]22[/TD][TD]0[/TD][/TR][TR][TD]buffer_finish_counter[/TD][TD]23[/TD][TD]1[/TD][/TR][/TABLE]Именно в этой функции и продает нужный скрипт - все дело в новом значении blFrameMode:
Смотрим /modules/main/classes/general/component_ajax.php
[CODE]if ($this->bIFrameMode)
{
$this->__PrepareScripts($data);
// fix IE bug;
$data = '<html><head></head><body>'.$data.'</body></html>';
}
[/CODE]
Скрытый текст |
---|
Странно, почему для фикса бага в IE не используется стандартная для битрикса функция IsIE()... |
[B]CComponentAjax::__PrepareForms()[/B] - готовит данные для вывода, то есть после исполнения template.php преобразует данные в нужный вид, в том числе с помощью [B]CAjax::GetForm. [/B]Что интересно - на обоих хитах возвращает одинаковый код, то есть выполняется одинаково, не зависимо от способа вызова - внутри обычной страницы или в составе AJAX-запроса.
[B]CAjax::GetForm()[/B] - функция переделывает код из шаблона компонента из такого:
[CODE]<form id="..." action="/temp.php" method="POST">
[/CODE]
В такой:
[CODE]<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>
[/CODE] И что ... характерно - исправно на обоих хитах!
[B]CComponentAjax[/B] - /bitrix/modules/main/classes/general/component_ajax.php
[B]CAjax[/B] - /bitrix/modules/main/ajax_tools.php
P.S. Так скоро все потроха от Ajax-а достану(
P.P.S. Расковырял весь Ajax, но дело не в скрипте, который удаляется на второй хит. Другие компоненты нормально работают и без него.
P.P.P.S. Проблема была в скрипте всплывающего окна, который изменял DOM - то есть добавлял свои элементы для создания всплывающего окна, в следствии чего BX.bind становился беспомощным, т.к. не обновляется вместе с DOM.