Задать вопрос
@dom12

Как вывести js скрипт перед закрывающим тегом body код?

Для добавления скрипта использую готовый код:
<?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?
  • Вопрос задан
  • 87 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@dom12 Автор вопроса
Единственное что мне пришло в голову (костыль, но работает).
<?php
function OnEndBufferContent(&$content){
	$meta = '<meta name="script" content="Y">';
	$result = Asset::getInstance()->getStrings('bottom');
	if((strpos($content,$meta)!==false) && $result){
		$content = addBodyScript(trim($result),str_replace($meta,'',$content));
	}	
}
function OnEpilog(){
	Asset::getInstance()->addString('<meta name="script" content="Y">');
	Asset::getInstance()->addString('<script></script>',false,'bottom');
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@koder_1
Битрикс программист
А зачем на столько сложно?
Почему не вставить в файл footer.php вашего шаблона сайта строчку
<script></script>
или через api битрикс
use Bitrix\Main\Page\Asset;
Asset::getInstance()->addJs(SITE_TEMPLATE_PATH . "/js/fix.js");
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы