Для добавления скрипта использую готовый код:
<?php
use Bitrix\Main\{HttpApplication,Page\Asset};
function getLastPositionIgnoreCase($haystack, $needle, $offset = 0){
if (defined("BX_UTF")){
if (function_exists("mb_orig_strripos")) return mb_orig_strripos($haystack, $needle, $offset);
return mb_strripos($haystack, $needle, $offset, "latin1");
}
return strripos($haystack, $needle, $offset);
}
function addBodyScript($script, $oldBuffer){
$search = '</body>';
$replace = $script. PHP_EOL .$search;
$bufferContent = $oldBuffer;
if(substr_count($oldBuffer, $search) == 1){
$bufferContent = str_replace($search, $replace, $oldBuffer);
}else{
$bodyEnd = getLastPositionIgnoreCase($oldBuffer, $search);
if ($bodyEnd !== false){
$bufferContent = substr_replace($oldBuffer, $replace, $bodyEnd, strlen($search));
}
}
return $bufferContent;
}
function OnEndBufferContent(&$content){
$request = HttpApplication::getInstance()->getContext()->getRequest();
if(!$request->isAdminSection() && !$request->isAjaxRequest()){
if($result = Asset::getInstance()->getStrings('bottom')){
$content = addBodyScript(trim($result), $content);
}
}
}
function OnEpilog(){
$request = HttpApplication::getInstance()->getContext()->getRequest();
if(!$request->isAdminSection() && !$request->isAjaxRequest()){
Asset::getInstance()->addString('<script></script>',false,'bottom');
}
}
Всё работает, но обнаружил не приятный момент.
Например в компоненте bitrix:iblock.element.add.form с включенным AJAX, при отправке добавляет вниз скрипт.
Как предотвратить добавления скрипта при ajax?