Как подключить js скрипт перед тегом body для модуля 1c bitrix?

Рейтинг: 0Ответов: 1Опубликовано: 14.08.2023

Я хотел подключить js скрипт для модуля, но консоль выдает ошибку

Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')
или
Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')
at HTMLDocument. (script.js?1692022393412:6:20)
at i (jquery-1.12.4.min.js?168665435097163:2:27449)
at Object.fireWith [as resolveWith] (jquery-1.12.4.min.js?168665435097163:2:28213)
at Function.ready (jquery-1.12.4.min.js?168665435097163:2:30006)
at HTMLDocument.K (jquery-1.12.4.min.js?168665435097163:2:30368)

Эти ошибка выходят не всегда, но как я понимаю, изображения, по которым ведётся поиск, не успевают прогрузиться, что приводит к ошибкам. Я в файле include подключил скрипт при помощи Bitrix\Main\Page\Asset::getInstance()->addJs(); Но этот способ подключает скрипт в head, а мне нужно подключить скрипт в конце body, как это можно сделать?

Ответы

▲ 0

Можно использовать javascript типа модуль. Модули выполняются после того, как загружены все остальные элементы страницы и в том порядке, в каком они указаны на странице. К сожалению, у битрикса нет встроенной поддержки модулей, поэтому придётся немного извратиться.

Идея в следующем: помещаем скрипты модулей в своё пространство строк (тогда битрикс не выводит их автоматически) и выводим их там, где нужно.

Подключаем модуль javascript в шаблоне компонента:

$APPLICATION->AddHeadString("<script type='module' src='" . CUtil::GetAdditionalFileURL($templateFolder . '/my_script.js') . "'></script>",
true, 'BOTTOM');

CUtil::GetAdditionalFileURL нужен для решения проблем с кэшированием в браузере. "BOTTOM' - это имя нашего пространства строк.

Теперь выводим его где нужно, например, в footer.php:

            <?
            echo "<!-->\n";
            echo Bitrix\Main\Page\Asset::getInstance()->getStrings('BOTTOM');
            echo "<!-->\n";
            ?>
    </body>
</html>