Могу ли я поставить _s satellite.pageBottom(); на файл JS?
Обычно вы помещаете метод _s satellite.pageBottom() как можно больше в самую нижнюю часть HTML, например:
...
<script type="text/javascript">_satellite.pageBottom();</script>
</body>
</html>
Но я получаю сообщения об ошибках в браузере, которые либо заблокированы при загрузке из-за слишком большой пропускной способности, либо браузер просто препятствует загрузке или задерживает загрузку, что приводит к _satellite undefined
ошибка
Так что я сделал, чтобы поместить его в файл JS и добавить defer="defer"
атрибут
...
<script src="/js/satellite.js?t=153664965811" defer="defer"></script>
</body>
</html>
Так что теперь это работает нормально, пока браузер не блокирует отслеживание JS API.
Так это нормально делать?
2 ответа
Резюме
Официально, вы не должны делать такие вещи.
подробности
В документации говорится следующее:
Важно: для успешной реализации важно следовать этим инструкциям, отображаемым в справке Adobe. В частности, вы должны поместить код заголовка в
<head>
раздел ваших шаблонов документов. Кроме того, вы должны поместить код нижнего колонтитула непосредственно перед закрытием</body>
тег. Размещение любого из этих кодов встраивания где-либо в вашей разметке или использование асинхронных методов для добавления кодов встраивания, или как-либо оборачивать коды встраивания, не являются поддерживаемыми реализациями динамического управления тегами. Код для встраивания должен быть реализован точно так, как это предусмотрено.Неподдерживаемая реализация приведет к неожиданным результатам и не даст службе поддержки и технической помощи оказать помощь в вашей реализации.
Поэтому, прежде чем я скажу что-либо еще, официальный ответ - нет, вы не должны делать такие вещи. Потеря поддержки со стороны Adobe, как правило, плохая идея, даже если реализация не является наилучшей практикой.
Неофициально..
Хорошо, во-первых, вы упомянули о получении ошибок, когда пытались делать подобные вещи. Во-первых, мне немного неясно, о каких ошибках вы упомянули. В частности, _satellite undefined
ошибка. Для меня это звучит так, как будто вы пытались загрузить асинхронный и / или отложенный скрипт Header, и библиотека DTM не была загружена вовремя до фрагмента нижнего колонтитула (_satellite.pageBottom()
) назывался. Но вы не упомянули об этом в своем вопросе; вы упомянули только проблемы с фрагментом нижнего колонтитула.
Опять же, официально, вы не можете делать подобные вещи ни с одним из фрагментов. Но даже если вы решите отклониться от документации, вам обязательно нужно убедиться, что фрагмент заголовка загружен до нижнего колонтитула, иначе вы получите " _satellite
является неопределенным "ошибки типа, потому что скрипт Header где _satellite
определено. Поэтому, если вы хотите заняться асинхронной и / или отложенной работой, вы должны изучить цепочки обещаний или обернуть скрипт Footer в какую-то логику, которая ищет _satellite
и если не найден, setTimeout
повторить попытку несколько раз. Или же..
На DOM готов, если _satellite.pageBottom()
еще не выполнено, DTM вызовет его самостоятельно. Таким образом, технически вам даже не нужно включать скрипт Footer на ваш сайт, если вы собираетесь использовать полную асинхронную / отложенную реализацию.
На этом замечании... переход на полностью асинхронную / отложенную реализацию DTM означает, что вы должны убедиться, что все, что вы развертываете через DTM, также является асинхронным. Я понятия не имею, что все вы развернули через DTM, но на практике, как минимум, у вас почти наверняка есть службы Experience Cloud ID (ECIDS) и Adobe Analytics (AA), развернутые через DTM, и DTM в настоящее время не поддерживает их развертывание. в асинхронном режиме (ECIDS должен быть загружен до AA). И это только один пример тега / инструмента.
Поэтому, как минимум, вы должны, по крайней мере, уважать документацию для тега Header. Тем не менее, тег "Нижний колонтитул" гораздо более простителен / выполним для всего остального, хотя, если вы убедитесь, что вы развертываете вещи только в DOM ready / async. Но опять же, официально, вы должны следовать документации для обоих, и это мой официальный ответ.
Альтернатива...
Вы должны рассмотреть возможность перехода с Adobe DTM на Adobe Launch. Launch - это новейшее решение Adobe для управления тегами. DTM постепенно сокращается. Launch может быть развернут с тегами Header и Footer так же, как DTM, где может быть применена синхронизация, но в отличие от DTM, Launch также имеет официальную опцию асинхронного развертывания. Тег заголовка может быть загружен асинхронно, и тега нижнего колонтитула нет (для асинхронного развертывания). Launch выполняет некоторые фокусы, чтобы обеспечить порядок операций для инструментов Adobe (например, ECIDS против AA, упомянутых выше). В работе также есть поддержка цепочки обещаний для других тегов, развернутых через Launch.
Единственный реальный камень преткновения - это использование Adobe Target. У Target есть версия асинхронной библиотеки, но большинство людей ее избегают, так как это противоречит принципам работы UX. А именно, асинхронный вызовет эффекты "мерцания" при загрузке, поскольку содержимое страницы по умолчанию удаляется, и браузер ожидает ответа для его загрузки. Как правило, это считается плохим UX, который наносит ущерб целостности тестирования AB/MV. Поэтому, если вы используете Target или планируете проводить тестирование AB/MV в целом, вам следует придерживаться обычного развертывания. Но все это отчасти отвлекает от вашего первоначального вопроса.
С помощью defer
(вы можете просто написать defer
нет необходимости defer=defer
) заставляет браузер извлекать указанные ресурсы по порядку. То, что вы хотите сделать, это поместить сценарии в следующем порядке:
<script src="/js/satellite.js?t=153664965811" defer></script>
<script type="text/javascript" defer>_satellite.pageBottom();</script>