Rubriky
Blog o webové analytice

Query selector (xpath) – Google Tag manager proměnná

Co to je?

Plná cesta ke kliknutému viděnému prvku v HTML, jednoznačně určující daný prvek.

K čemu to je?

  • Pěkné popisky kliknutí.
  • Použití ve vlastních proměnných a podmínkách

Námitky:

Ano, když si v podmínce vyberete „click element“ tak máte možnost použít „CSS selector“. Lze to použít, ale nejde si v tom tolik hrát ještě s reguláry etc. a už vůbec to nemůžete použít jako vstup do RegEx vyhledávací tabulky etc.

Postup tvorby proměnné:

  1. Jít do Google tag manageru a zvolit příslušný GTM kontejner.
  2. Proměnné (variables)
  3. Povolit základní proměnnou Click element.
  4. .Založit novou proměnou.
  5. Vlastní javascript a vložit následující kód.
  6. Hotovo
function() {
  if ({{Event}}=="gtm.click"||{{Event}}=="gtm.linkClick" ||{{Event}}=="gtm.elementVisibility"){
  var el = {{Click Element}};
  var stack = [];
  while ( el.parentNode != null ) {
    var sibCount = 0;
    var sibIndex = 0;
    for ( var i = 0; i < el.parentNode.childNodes.length; i++ ) {
      var sib = el.parentNode.childNodes[i];
      if ( sib.nodeName == el.nodeName ) {
        if ( sib === el ) {
          sibIndex = sibCount;
        }
        sibCount++;
      }
    }
    if ( el.hasAttribute('id') && el.id != '' ) {
      stack.unshift(el.nodeName.toLowerCase() + '#' + el.id);
    } else if ( sibCount > 1 ) {
      stack.unshift(el.nodeName.toLowerCase() + ':eq(' + sibIndex + ')');
    } else {
      stack.unshift(el.nodeName.toLowerCase());
    }
    el = el.parentNode;
  }

  return (stack.slice(1)).join(' > '); 

}
}

 

Příklady výstupu této proměnné:

Řekněme, že bych chtěl měřit třeba kliknutí na obrázek v pravém sloupci.

Asi nejjednoduší je kliknou na daný obrázek pravým tlačítkem a dát „prozkoumat “ ¨(inspect chrome)

Následovně vybrat prvek v HTML a dát zase pravé tlačítko > kopírovat > kopírovat Seletor.

Výsledek takto získané cesty bude zkrácená verze selectoru.
#text-3 > div > div > img
Určující dostatečně unikátně o který prvek se jedná na stránce.

Pokud bych chtěl měřit jen tento jeden obrázek, mohu to udělat pravidlo, přes zmíněný „Click element“ v kombinaci CSS selectoru v GTM.

Pokud použijete mou GTM proměnou získáte celou cestu CSS selectoru  a na konci bude předešlí krátký selector.
body > div#page > div#content > div:eq(1) > div > div#secondary > div > aside#text-3 > div > div > img

Pokud bych však chtěl šetřit množství značek a pravidel a chtěl přitom měřit více obrázků a chtěl je třeba i pěkně popsat nastane problém. CSS selector je jen v podmínce a nejde použít nikde jinde a proto jsem napsal i tento skript.

Tímto způsobem si můžete třeba vytvořit jednoduché podmínky v pravidlech kliknutí a kliknutí na odkazy. Zvláště to je super pokud máte více stejně pojmenovaných tlačítek a chce je navzájem rozlišit.

Jedno z použití je třeba vytváření pěkných popisků pro eventy dle bloku obsahu.
Třeba u mě wordpresu to bude, pokud obsahuje selector:

  • #footer-area je to odkaz z patičky
  • #secondary pravý sloupec
  • article#post odkaz z článku
  • etc.

To vložíte do RegEx tabulky,  vypnete plnou shodu a hurá do toho. U interních odkazů to posílám místo evetnAction, kde normálně mívám doménu externího odkazů.

Můžete si tak třeba třídit interní odkazy…  rozlišíte, které kliknutí na odkaz bylo z patičky, menu, přes logo etc. Možností je nepočítaně.

Napište mi na sociálních sítích, jestli se vám takové scripty hodí / libí.
Komentáře jsem vypnul, diskuzi prosím směrovat na Facebook či Twitter

Update 2021-10-22

Detailní css selector:

Může se hodit, když původní verze nestačí a potřebujete se dostat k většímu detailu, propisuje vždy element class a ID.
Tato verze dělá soupis všeho a nic nevynechává.

function() {
  var e= {{Click Element}};
	var s = "", t, i, c, p, n;
	do{
		t = e.tagName.toLowerCase();
		i = e.hasAttribute("id") ? "#" + e.id : "";
		c = e.hasAttribute("class") ? "." + e.className.split(/\s+/).join(".") : "";
		p = e.parentNode;
		n = Array.prototype.filter.call(e.parentNode.childNodes,function(x){
				return x.nodeType == Node.ELEMENT_NODE;
			}).indexOf(e) + 1;
		s = t + i + c + ":nth-child(" + n + ") > " + s;
	}while( !p || !(e = p).tagName.match(/^HTML$/i) );
	return s.slice(0,-3);
}
.