Слушатель событий для push-событий dataLayer в Tag Manager JS

Я хочу добавить настраиваемый сценарий, который интегрируется в существующий уровень данных Диспетчера тегов на странице. Мне нужен этот скрипт, чтобы получать уведомления о новых толчках dataLayer. Поэтому всякий раз, когда что-то на странице использует window.dataLayer.push, мой сценарий должен быть проинформирован об этом.

Есть ли способ добавить пользовательский прослушиватель событий dataLayer в Google Script API?

Я ищу что-то вроде

google_tag_manager.dataLayer.onPush(callback);

Кажется, что в google_tag_manager.dataLayer.subscribers указано количество подписчиков уровня данных, но как я могу добавить своих?

Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
29
2

Ответы 2

Я не уверен, что вы можете сделать «родную» реализацию с помощью объекта google_tag_manager. Однако вы можете переопределить метод push в массиве dataLayer.

const originalPush = dataLayer.push
dataLayer.push = function(...args) {
    // notify here
    console.info('dataLayer.push was called');
    
    originalPush(...args);
}

Затем вы можете реализовать некоторую логику на основе Шаблон наблюдателя.

Ниже я показываю ОЧЕНЬ простую реализацию, просто для демонстрации.

const originalPush = dataLayer.push
const dataLayerListeners = [];
dataLayer.push = function(...args) {
    dataLayerListeners.forEach(listener => listener.notify())
    
    originalPush(...args);
}

class DatalayerListener {
    constructor(name) {
        this.name = name;
    }
    notify(args) {
        console.info("I'm listener "+this.name+" and I'm being notified that the dataLayer.push method was called");
    }
}

const listener1 = new DatalayerListener('listener1');
const listener2 = new DatalayerListener('listener2');

dataLayerListeners.push(listener1);
dataLayerListeners.push(listener2);

В JavaScript есть объект Proxy, с помощью которого вы можете установить ловушки всякий раз, когда операция выполняется над объектом. Поскольку массивы также являются объектами, вы можете реализовать их с помощью прокси.

При вызове метода push для массива новое значение будет set для массива. Таким образом, установка ловушки для метода set должна позволить нам добавить поведение к методу push.

Каждый раз, когда что-то нажимается, создайте событие и отправьте его. Теперь при добавлении значения в массив dataLayer будет генерироваться событие. Вы можете прослушивать это событие из каждого файла, чтобы действовать при добавлении значения в массив dataLayer.

С помощью Reflect мы можем убедиться, что исходное поведение метода push восстановлено, сохраняя при этом добавленное поведение.

var dataLayer = window.dataLayer || new Proxy([], {
  set: (obj, prop, value) => {  
    if (prop !== 'length') {
      const pushEvent = new CustomEvent('datalayerpush', {
        detail: value
      });

      window.dispatchEvent(pushEvent);
    }
    
    return Reflect.set(obj, prop, value);
  }
});

window.addEventListener('datalayerpush', event => {
  console.info(`Value pushed to dataLayer: ${JSON.stringify(event.detail, null, 2)}`);
});

dataLayer.push({
  event: 'test'
});

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