DataLayer.push не работает после скрипта GTM

Я хочу реализовать расширенную электронную торговлю с помощью Диспетчера тегов Google, и я хочу отправить некоторые данные для тега Universal Analytics.

Я всегда создавал dataLayer перед сценарием GTM, но теперь мне нужно отправить другие данные с помощью dataLayer.push

И это не работает, datalaLayer.push работает, только если я делаю это непосредственно перед запуском скрипта GTM.

Пример. Это работает:

   <script>
    <head>
     dataLayer = [{   

            'google_tag_params': {
               'ecomm_pagetype': 'category',
               'ecomm_category': '{{ $resource->seo->h1 }}',
             }
         }];

    dataLayer.push({
              'ecommerce': {
                'currencyCode': 'EUR',    
                'impressions': [
                     {
                        'id':       '12312',
                        'price':    24,
                        'category': 'wfwefwerwerwer',
                        'position': 2,
                        'name':     'wfwefwerwerwer',  
                        'brand':   'My Brand',
                        'list':    'Product List',

                    }
                ]
              }
            });

    (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-XXXXXX');

    </script>
    </head>

Но если я использую dataLayer.push после того, как сценарий GTM не работает, данные не отправляются и не сообщается об ошибках.

У меня это не работает:

<head>
    <script>
         dataLayer = [{   

                'google_tag_params': {
                   'ecomm_pagetype': 'category',
                   'ecomm_category': '{{ $resource->seo->h1 }}',
                 }
             }];


        (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
        new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
        })(window,document,'script','dataLayer','GTM-XXXXXX');

    </script>
</head>

<body>

    //something content html here

    <footer></footer>

    <script>
        dataLayer.push({
          'ecommerce': {
            'currencyCode': 'EUR',    
            'impressions': [
                 {
                    'id':       '12312',
                    'price':    24,
                    'category': 'wfwefwerwerwer',
                    'position': 2,
                    'name':     'wfwefwerwerwer',  
                    'brand':   'My Brand',
                    'list':    'Product List',

                }
            ]
          }
        });
    </script>
</body>

Что вы видите в режиме отладки GTM, когда открываете эту страницу? С push-вызовом все в порядке, хотя в нем отсутствует событие, которое может быть обработано GTM. У вас не будет этих данных во время события просмотра страницы, но вы увидите указанное вами событие, и вы можете создать для него триггеры.

kgrg 01.08.2018 08:49

@kgrg, я думаю, тебе стоит дать ответ. То, что данные недоступны из-за отсутствующего события, будет выглядеть так, как будто это не работает, поэтому это кажется наиболее вероятной причиной.

Eike Pierstorff 01.08.2018 09:12

Кстати, для новичков в Analytics в документации очень плохо объясняется, что window.dataLayer.push на самом деле ПАТЧИРОВАННЫЙ GTM для запуска собственного кода. Это уже не просто тупой массив, сидящий на странице. Вот как вы можете добавить к нему позже. Введите window.dataLayer.push в консоли браузера, и вы увидите, что это настраиваемая функция в gtm.js.

Simon_Weaver 06.09.2019 11:37

Совет: отключите кеширование в Chrome при частом обновлении тегов GTM, чтобы убедиться, что вы используете последнюю версию technipages.com/google-chrome-how-to-completely-disable-cach‌ e - Иногда у вас может быть все идеально настроено, но ваш браузер просто использует старую версию

Simon_Weaver 06.09.2019 21:04

Вам не хватает части var при объявлении уровня данных. Вы можете использовать var или просто добавить его в пространство имен окна window.dataLayer

dockeryZ 17.03.2021 15:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
11
5
15 831
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не следуете лучшим практикам, поэтому столкнетесь с проблемами, рано или поздно.

  • Всегда используйте .push вместо инициализации: ваш первый вызов - это инициализация массива (dataLayer = [). Это означает, что, если dataLayer уже существует, он будет полностью перезаписан, включая метод .push, который настроен GTM для получения отправленных событий. Сейчас он работает нормально, потому что вы вызываете GTM после инициализации. Но это плохая привычка. Однажды вы переместите GTM выше этой инициализации или добавите аналогичные вызовы инициализации после GTM, и он сломается.

Ваши звонки должны быть:

window.dataLayer = window.dataLayer || [];  
dataLayer.push({...});
  • Всегда устанавливайте свойство event: свойство event используется GTM для определения триггеров и определения того, когда данные становятся доступными. У вас может быть 2 последовательных вызова .push, 1-й с event и 2-й без, и данные с 1-го будут доступны во 2-м событии (пока это событие не перезапишет его), но опять же, это плохо. привычка и игра с огнем.

Например:

dataLayer.push({
  'event': 'ecommerce', // naming is up to you, should match your GTM triggers 
  'ecommerce': {
  ...

В вашем конкретном случае, поскольку ключ event отсутствует, он работает до тех пор, пока GTM загружается после нажатия, потому что данные уже есть, когда GTM срабатывает. Когда вызов push перемещается после GTM, потому что нет свойства event, есть только GTM не может узнать, когда данные станут доступны. Итак, вам следует:

  • Добавьте ключ event (всегда!)
  • Настройте триггер, соответствующий event

Вот еще несколько материалов по этим темам:

Мой первый вызов должен быть dataLayer = window.dataLayer || []; и dataLayer.push ({...}) ;, но где разместить скрипт GTM? до или после? Спасибо

Antonio Morales 02.08.2018 07:53

GTM должен загружаться как можно скорее, чтобы минимизировать задержку (браузеру необходимо получить GTM = 1 сетевой цикл туда и обратно, затем получить другие библиотеки = 2-й рейс, а затем, в конечном итоге, запустить аналитические события). Так что размещайте GTM как можно раньше после <head>. Что касается вызовов .push, не имеет значения, где вы их размещаете, если вы всегда используете .push и инициализируете первый раз (window.dataLayer || []). Если GTM уже установлен, вы возьмете созданный им слой данных (window.dataLayer), в противном случае вы создадите фиктивный массив (`|| []`), который позже GTM преобразует в соответствующий уровень данных, сохраняя свои данные.

Max 02.08.2018 10:10

Другие вопросы по теме