скрипт аналитики не отправляет данные из теневого DOM - PullRequest
4 голосов
/ 13 марта 2019

Мы работаем над отслеживанием сайта, компоненты которого построены с использованием концепций Shadow DOM, когда мы создаем правило при запуске для добавления тегов к этим компонентам, оно не работает.

Можете ли вы рассказать нам о лучших способах пометки компонентов в Shadow DOM?

Я нашел вопросы без ответа по поводу Google Analytics Google Analytics в теневом DOM не работает этоверно для аналитики Adobe также?

1 Ответ

2 голосов
/ 17 марта 2019

Лучшая практика

Во-первых, суть использования концепций Shadow DOM заключается в том, чтобы обеспечить охват / закрытие веб-компонентов, чтобы люди не могли просто совать их и портить.В принципе, это похоже на локальную переменную области действия внутри функции, которой не может коснуться более высокая область видимости.На практике можно обойти эту «стену» и разобраться с ней, но она разрушает «дух» теневого DOM, что в ИМО является плохой практикой.

Итак, если бы я посоветовал какую-то лучшую практику по любому из этих вопросов, мой первый совет - как можно больше, уважать дух веб-компонентов, использующих теневой DOM, и относиться к ним как к черному ящику, который онистремиться быть.Это означает, что вам следует обратиться к веб-разработчикам, отвечающим за веб-компонент, и попросить их предоставить интерфейс для использования.

Например, Adobe Launch имеет возможность прослушивать пользовательские события, транслируемые на (легкий) DOM, поэтому разработчики сайта могут добавлять в свой веб-компонент, создавать пользовательские события и транслировать их по нажатию кнопки.,

Примечание: Пользовательский прослушиватель событий запуска будет прослушивать только пользовательские трансляции событий, начинающиеся с document.body, , а не document, поэтому обязательно создайтеи транслировать пользовательские события на document.body или глубже.

"Но разработчики ничего не сделают, поэтому я должен взять дело в свои руки ..."

К сожалению, это чаще всего реальность, поэтому ты должен делать то, что должен.Если это так, то в настоящее время у Launch нет нативных функций, которые действительно облегчили бы вам жизнь в этом отношении (во всяком случае, для «основной» части нижеприведенного материала), и на этом посту AFAIK естьнет публичных расширений, которые предлагают что-либо для этого, либо.Но это не значит, что вы SoL.

Но я хочу заявить, что я не уверен, что поспешил бы назвать остальную часть этого ответа "Лучшая практика", а не "Это '' '1029 * решение ...",Главным образом потому, что это в основном включает в себя просто выгрузку большого количества чистого javascript в специальное поле кода и вызов его за день, что является более универсальным решением в крайнем случае.

Между тем, как правило, рекомендуется избегать использования пользовательских полей кода, когда речь идет о менеджерах тегов, если это не требуется.Весь смысл менеджеров тегов состоит в том, чтобы абстрагировать код.

Я думаю, что TL; DR здесь, в основном, я повторяю это, что в идеале должно быть помещено на сайт разработчика сайта.Но если вам все-таки действительно нужно сделать все это в Launch, потому что причины TM , продолжайте читать.

'A' Solution ...

Примечание: Это действительно базовый пример с простым сценарием теневого DOM с открытым режимом - в действительности ваш сценарийпочти наверняка намного сложнее.Я ожидаю, что вы узнаете, что вы делаете с javascript, если вы углубитесь в это!

Допустим, у вас есть следующее на странице.Простой пример пользовательского HTML-элемента с кнопкой, добавленной в его теневой DOM.

<script>
class MyComponent extends HTMLElement {
    constructor() {
        super();
        this._shadowRoot = this.attachShadow({
            mode: 'open'
        });
        var button = document.createElement('button');
        button.id = 'myButton';
        button.value = 'my button value';
        button.innerText = 'My Button';
        this._shadowRoot.appendChild(button);
    }
}
customElements.define('my-component', MyComponent);
</script>
<my-component id='myComponentContainer'></my-component>

Допустим, вы хотите активировать правило, когда посетитель нажимает кнопку.

Пример быстрого решения

В этот момент я, вероятно, должен сказать, что вы можете обойтись без выполнения правила события Launch click с селектором запросов my-component#myComponentContainer с пользовательским кодомусловие вдоль линий:

return event.nativeEvent.path[0].matches('button#myButton');

Нечто подобное должно работать для этого сценария, потому что здесь выровнено много звездочек:

  • Теньdom - это открытый режим, так что никаких хаков для перезаписи вещей
  • Существуют легко идентифицируемые уникальные селекторы css для уровней DOM света и тени
  • Вы просто хотите прослушать событие click, которое всплываети действует как щелчок по легкому корню DOM теневого корня.

На практике ваши требования, вероятно, не будут такими простыми.Возможно, вам нужно подключить какой-либо другой прослушиватель событий, например, событие воспроизведения видео.К сожалению, на данный момент не существует решения «один размер подходит всем»;это зависит только от ваших требований к отслеживанию.

Но в целом цель почти такая же, как и то, что вы бы попросили разработчиков: создать и передать собственное (светлое) событие DOM в контексте теневого DOM.

Пример лучшего решения

Используя тот же пример компонента и требования, что и выше, вы можете, например, создать правило для запуска в DOM Ready.Назовите это как «Отслеживание моих компонентов - ядро» или как угодно.Никаких условий, если только вы не хотите что-то сделать, например, проверить, существует ли элемент DOM корневого легкого веб-компонента или что-то еще.

В целом, это основной код для присоединения прослушивателя событий к кнопке и отправки пользовательского события для прослушивания Launch.Обратите внимание, этот код основан на нашем примере компонентов и требованиях к отслеживанию, приведенным выше.Это уникально для этого примера.Вам нужно будет написать похожий код на основе ваших собственных настроек.

Добавьте пользовательский контейнер js с чем-то вроде этого:

// get the root (light dom) element of the component
var rootElement = document.querySelector('#myComponentContainer');
if (rootElement && rootElement.shadowRoot) {
    // get a reference to the component's shadow dom
    var rootElementDOM = rootElement.shadowRoot;

    // try and look for the button 
    var elem = rootElementDOM.querySelector('button#myButton');
    if (elem) {
        // add a click event listener to the button
        elem.addEventListener('click', function(e) {
            // optional payload of data to send to the custom event, e.g. the button's value
            var data = {
                value: e.target.value
            };

            // create a custom event 'MyButtonClick' to broadcast
            var ev = new CustomEvent('MyButtonClick', {
                detail: data
            });

            // broadcast the event (remember, natively, Launch can only listen for custom events starting on document.body, not document!
            document.body.dispatchEvent(ev);
        }, false);
    }
}

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

Пример пользовательского правила события

Rule name: My Button clicks

События

Extension: Core
Event Type: Custom Event
Name: MyButtonClick
Custom Event Type: MyButtonClick
Elements matching the CSS selector: body

Условия

*None for this scenario*

Здесь вы можете установить любые Действия , которые вы хотите (установить переменные Adobe Analytics, отправить маяк и т. Д.).

Примечание: В этом примере я отправил данные в пользовательское событие.Вы можете ссылаться на полезную нагрузку в любом произвольном (javascript) кодовом поле с помощью event.detail, например event.detail.value.Вы также можете ссылаться на них в полях запуска с помощью синтаксиса %, например %event.detail.value%.

...