Обычно вы размещаете метод _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.
Так это нормально делать?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Резюме
Официально вы не должны делать такие вещи.
Подробности
В документация указано следующее:
Important: For a successful implementation, it is critical that you follow these instructions as they appear in Adobe Help. Specifically, you must place the header code in the
<head>section of your document templates. Also, you must place the footer code just before the closing</body>tag. Placing either of these embed codes elsewhere in your markup, or using asynchronous methods to append the embed codes, or wrapping the embed codes in any way, are not a supported implementations of dynamic tag management. The embed codes must be implemented exactly as provided.An unsupported implementation will yield unexpected results and prevent Customer Care and Engineering from assisting with your implementation.
Итак, прежде чем я скажу что-то еще, официальный ответ: нет, вам не следует делать подобные вещи. Потеря поддержки от Adobe, как правило, плохая идея, даже если реализация не является лучшей практикой на данный момент.
Неофициально..
Хорошо, во-первых, вы упомянули об ошибках, когда пытались сделать что-то подобное. Во-первых, мне немного неясны ошибки, которые вы упомянули. В частности, ошибка _satellite undefined. Для меня это звучит так, как будто вы пытались загрузить скрипт Заголовок асинхронно и/или отложенно, а библиотека DTM не была загружена вовремя до того, как был вызван фрагмент Нижний колонтитул (_satellite.pageBottom()). Но вы не упомянули об этом в своем вопросе; вы упомянули проблемы только с фрагментом Нижний колонтитул.
Опять же, официально вы не можете делать такие вещи с либо фрагментов. Но даже если вы решите отклониться от документации, вам обязательно нужно убедиться, что фрагмент заголовка загружается перед нижним колонтитулом, иначе вы получите ошибки типа «_satellite is undefined», потому что скрипт заголовка находится там, где определено _satellite. Поэтому, если вы хотите побаловаться с асинхронным и/или отложенным выполнением, вам следует изучить цепочки промисов или обернуть сценарий нижнего колонтитула некоторой логикой, которая ищет _satellite и, если не находит, setTimeout, чтобы повторить попытку несколько раз. Или..
При готовности DOM, если _satellite.pageBottom() еще не выполнилась, DTM внутренне вызовет ее самостоятельно. Таким образом, технически вам даже не нужно включать скрипт нижнего колонтитула на свой сайт, если вы собираетесь использовать полную асинхронную/отложенную реализацию.
На этом примечании... переход к полностью асинхронной/отложенной реализации DTM означает, что вы должны убедиться, что все, который вы развертываете через DTM, также является асинхронным. Я понятия не имею, что все, что вы развернули через DTM, но на практике, как минимум, у вас почти наверняка есть служба Experience Cloud ID Service (ECIDS) и Adobe Analytics (AA), развернутые через DTM, и DTM в настоящее время не поддерживает их развертывание. асинхронно (ECIDS необходимо загрузить перед AA). И это только пример тега/инструмента один.
Так что, как минимум, вы, вероятно, должны соблюдать документацию для тега Header. Тем не менее, тег нижнего колонтитула гораздо более щадящий / выполнимый практически для всего остального, если вы убедитесь, что вы развертываете вещи только в готовом к DOM / асинхронном режиме. Но опять же, официально вы должны следовать документации для обоих, и это мой официальный ответ.
Альтернатива...
Вам следует подумать о переходе с Adobe DTM на Adobe Launch. Launch — это новейшее решение Adobe для управления тегами. DTM прекращается. Launch можно развернуть с помощью тега верхнего и нижнего колонтитула, как и DTM, где можно принудительно указать время, но, в отличие от DTM, Launch также имеет официальный вариант асинхронного развертывания. Тег заголовка можно загрузить асинхронно, а тег нижнего колонтитула отсутствует (для асинхронного развертывания). Launch делает несколько фокусов, чтобы обеспечить порядок операций для инструментов Adobe (например, ECIDS против AA, упомянутых выше). В разработке также находится поддержка цепочки обещаний для других тегов, развернутых через Launch.
Единственный реальный камень преткновения — если вы используете Adobe Target. У Target есть версия асинхронной библиотеки, но большинство людей избегают ее, поскольку она противоречит тому, как принципиально работает UX. А именно, асинхронность вызывает эффекты «мерцания» при загрузке, поскольку содержимое страницы по умолчанию удаляется, и браузер ожидает ответа на его загрузку. Обычно это не одобряется как плохой UX, который наносит ущерб целостности усилий по тестированию AB/MV. Поэтому, если вы используете Target или планируете проводить тестирование AB/MV в целом, вам следует придерживаться обычного развертывания. Но все это отвлекает от вашего первоначального вопроса.
Спасибо за ответ Crayon! Я могу попытаться спросить Adobe об этом.