Я хочу добавить настраиваемый сценарий, который интегрируется в существующий уровень данных Диспетчера тегов на странице. Мне нужен этот скрипт, чтобы получать уведомления о новых толчках dataLayer.
Поэтому всякий раз, когда что-то на странице использует window.dataLayer.push, мой сценарий должен быть проинформирован об этом.
Есть ли способ добавить пользовательский прослушиватель событий dataLayer в Google Script API?
Я ищу что-то вроде
google_tag_manager.dataLayer.onPush(callback);
Кажется, что в google_tag_manager.dataLayer.subscribers указано количество подписчиков уровня данных, но как я могу добавить своих?



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


Я не уверен, что вы можете сделать «родную» реализацию с помощью объекта 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'
});