Rolf B: jQuery Element selektieren, welches über ein externes Script generiert wird

Beitrag lesen

Hallo ebody, hallo Matthias,

was ist denn hier passiert? Nach dem Edit (weshalb auch immer der erfolgte) ist das Posting völlig verstümmelt und das Problem nicht mehr erkennbar.

Wenn das hier

Statt $(document).ready() sollte $() verwendet werden.

eine hineineditierte Antwort sein soll - nein, das ist keine hilfreiche Antwort, nur eine Umstellung von deprecated auf empfohlen. Das ändert nichts am Timing, aber es zu machen ist trotzdem richtig.

In der Versionshistorie steht:

Mein Ziel ist es später, den Klick auf den Link "Ok, verstanden" von dem Banner (rechts unten) abzufangen. Zu Testzwecken schaue ich aber erstmal, ob ich ein Element von dem Banner überhaupt selektieren kann.
Da ich die Funktion aber unter dem Banner Script ausführe und auch innerhalb von $(document).ready(function() { // wenn das DOM fertig geladen ist sollte der Code vom Banner auch zu selektieren sein.

Ich möchte jetzt nicht die Qualität dieses Cookie-Hinweis Scripts bewerten, sondern nur auf deine Aufgabenstellung eingehen.

Ich habe mir das Script für den Cookie Hinweis mal angeschaut; das hat am Ende einen eigenen Ready-Handler, der über eine Abfrage von document.readyState === 'completed' funktioniert.

MDN sagt zum readyState des Dokuments: completed: The document and all sub-resources have finished loading. The state indicates that the load event is about to fire.

Dagegen sagt die jQuery Doku: The .ready() method offers a way to run JavaScript code as soon as the page's Document Object Model (DOM) becomes safe to manipulate.

D.h. die Abfrage des ReadyState entspricht einer Registrierung auf das load-Event des Dokuments. jQuery.ready() (a.k.a. $()) entspricht aber einer Registrierung auf DOMContentReady, was früher stattfindet. Deswegen suchst Du in deinem Ready-Script nach DOM Elementen, die erst später erscheinen.

Einen Hook, den Du im Script nutzen kannst um auf einen Klick dort zu reagieren, finde ich spontan nicht (wobei ich das Markup im Script auch für Käse halte; Buttons realisiert man nicht als Link!).

Da der readyState-Change vor dem Load-Event kommt, solltest Du Dich auf das load Event des Dokuments registrieren - aber nur, wenn der readyState Wert des Dokuments nicht schon complete ist, sonst kommt kein load mehr. Ist er schon complete, brauchst Du keine Registrierung mehr sondern kannst direkt loslegen.

Sinngemäß so:

if (document.readyState === 'complete')
   registerForButton();
else
   document.addEventListener('load', registerForButton);

und in der registerForButton-Funktion solltest Du dann deine DOM Elemente finden können.

Rolf

--
sumpsi - posui - clusi