JavaScript-Fehler bei TMENU_LAYERS

/ Autor: Albrecht, 24 Apr 2009

Bei der Entwicklung eines neuen Projekts in TYPO3, verwendeten wir für ein Layer-Menü die fertige Komponente TMENU_LAYERS. In willkürlichen Intervallen tauchten JavaScript-Fehler auf und die Navigation konnte nicht benutzt werden. Im Internet Explorer tauchte ein Alert-Fenster mit der Meldung “Stack overflow” auf, während der Firefox zwar nicht mit einer penetranten Meldung nervte, aber dennoch einen Fehler “too much recursion” in die Fehlerkonsole schrieb.

Stack overflow too much recursion

Wie bereits erwähnt, tauchte der Fehler völlig unregelmäßig auf und ließ sich nicht reproduzieren. In so einem Fall ist eine Fehlersuche nahezu unmöglich, da man den Code von Grund auf analysieren und überarbeiten müsste. Auch eine Suche über Google zu diesem Problem ergab keine hilfreichen Ergebnisse.

Nach mehreren gescheiterten Ansätzen, das Problem in der JavaScript-Datei zu suchen und zu beheben, stolperte ich auf die Vergabe der IDs, mit denen JavaScript die HTML-Objekte ansprechen und ein- und ausblenden kann. Diese Vergabe findet in der Datei tmenu_layers.php.inc statt und sieht (vereinfacht) so aus:

$this->WMid = substr(md5(microtime()),0,6);

Das bedeutet, dass für jedes Element eine ID aus der Micro-Time generiert wird und von dem Hash lediglich die ersten 6 Stellen als ID benutzt werden. Ich weiß nicht genau, ob es an der Kürze des Hashes oder an den Millisekunden als Grundlage lag, aber diese Vorgehensweise zur ID-Generierung erzeugte Kollisionen und vergab die IDs hin und wieder an mehrere HTML-Elemente gleichzeitig.

Um diese Kollisionen zu verhindern, änderte ich die ID-Vergabe um und nahm die PHP-Funktion uniqid() als Grundlage. Diese Funktion basiert zwar auch auf der aktuellen Micro-Time, lässt sich aber mit einen Parameter dazu bringen, die Rückgabe zusätzlich mit einem Zufallswert zu erweitern. Da dieser Zufallswert mit einem . angehängt wird, dies aber einen JavaScript-Fehler verursachen würde, habe ich anschließend noch alle Punkte aus der Rückgabe entfernt.

Die neue ID-Vergabe in der Datei tmenu_layers.php.inc sieht jetzt (vereinfacht) so aus:

$this->WMid = str_replace('.','',uniqid('',true));

Seit dieser Änderung ist der JavaScript-Fehler nicht mehr aufgetaucht. Ich gehe also davon aus, dass es die korrekte Lösung war.

2 Responses to “JavaScript-Fehler bei TMENU_LAYERS”

  1. Franz Says:
    19 Okt 2009

    Danke dafür! Hat meinen Vormittag gerettet!

  2. albrechtk Says:
    23 Okt 2009

    Wenn’s bei mir nur ein Vormittag gewesen wäre … ;) Da ging deutlich mehr drauf. Vor allem meine Nerven.

    Aber freut mich, wenn es dir geholfen hat.

Leave a Reply