Pytanie, w jaki sposób następuje to wstrzykiwanie? Często takie rzeczy są wstrzykiwane przez iframe właśnie po to, żeby zachować izolację różnych zewnętrznych wtyczek od głównej strony.
W tym wypadku jest to raczej proste, na froncie łapiemy element po klasie i używamy na nim metody appendChild()
, jako argument podajemy to co pisałem wyżej.
Kod odpalany jest np na kliknięcie w przycisk na stronie, po jego kliknięciu pojawia się na stronie content. Nie jest to iframe, dodaje do rodzica dziecko.
Problem mam z tym, że nie wiem w jaki sposób wywołać kod, który osadzam na stronie.
Tak wygląda przykładowo struktura html bazowej strony:
<html>
<body>
etc etc
<div class="x-custom-elem"></div>
</body>
</html>
A tak po osadzeniu kodu dodatkowego:
<html>
<body>
etc etc
<div class="x-custom-elem">
<div>costam</div>
<style> div {background-color: red;}</style>
<script> function attachBehaviour() {console.log('test')} attachBehaviour()</script>
</div>
</body>
</html>
Dodatkowo, w samym kodzie błędu nie ma jako tako bo testując wszystko na localhoscie cały komponent działa bez zarzutu.
Ten kod działa też jeśli wrzuce cały w np onload elementu img, na przykład:
<img src="https://someurl.com" onload="dataLayer.push({'event':'test','event_category':'test','event_label':'test','event_action':'dosmth'});"/>
Nie chce tu jednak używać onloada bo sam kod funkcji jest tak rozbudowany ze wole uniknąć escapowania wszystkiego używając iife
bezpośrednio w onloadzie.
Mam jeszcze pomysł taki, żeby za pomocą appendChild()
zdefiniować funkcje a wywołać ją tylko w onload
, ale tak jak pisałem tutaj dostaje info, że funkcja jest niezdefiniowana. Sprawdzałem czy działają w tym samym scopie, onload daje błąd nawet jak go wypale po wielu sekundach od appendChild()
.
Ja w strukturze html strony widzę to co wrzucam tylko nie rozumiem dlaczego nie mam do tego dostępu. Nawet w konsoli wywołując window.attachBehaviour()
nie znajduje mi tej funkcji.
EDIT
Badając jak to działa, w zewnętrznej usłudze nie idzie po prostu appendChild()
ale raczej coś na wzrór replaceChildren()
, dowiem się pewnie dopiero po weekendzie, sprawdzając jak zachowują się te metody to nie jest tak prosto rozwiązane, zerknę do dokumentacji jak to ugryźć.