Problem mit setTimeout() und Objekten

  • Themenstarter Themenstarter daze
  • Beginndatum Beginndatum
D

daze

Hallo zusammen,

ist glaube ich mein erstes Posting hier, und gleich schon mal eine Frage. :-)

Ich schreibe mir ein kleines Menü für eigene Zwecke und ich hab da ein fieses Problem mit der setTimeout() Methode.

Wie man unten in der Funktion collapse() sehen kann will ich das Submenü nach X Millisekunden schließen, es aber immer die Meldung, das mNode.obj in der Funktion setClassName() keine "properties" hat.

EDIT: "has no properties" meldet der Firefox, alert() meldet "undefined"

Ich habe in beiden Funktionen mit alert() getestet, ob mNode vorhanden ist. In collapse() kurz vor dem setTimeout ist das Objekt noch da, aber in der Funktion setClassName schon nicht mehr, warum auch immer. Vielleicht habe ich ein Brett vorm Kopf, und jemand kann es mir wegnehmen...

Auch wenn der Code etwas umständlich aussieht, das kommt vom vielen Probieren, aber imho sollte der Code Valid sein. Belehrt mich eines besseren. :rolleyes:

PHP:
function getObj(mNode)
{
  if (isDOM) {
    this.obj = document.getElementById(mNode);
    this.style = document.getElementById(mNode).style;
  } else if (isIE) {
    this.obj = document.all[mNode];
    this.style = document.all[mNode].style;
  } else if (isNS4) {
    this.obj = document.layers[mNode];
    this.style = document.layers[mNode];
  }
}

function setClassName(mNode, class_name)
{
  mNode.obj.className = class_name;
}


function collapse(mNode, mLit, mTo)
{
  if (!isDyn) return; // kein DHTML-Browser
  mN = mNode; mL = mLit;
  var mNode = new getObj(mNode);
  var mLit  = new getObj(mLit);
  if (mLit.obj.className != off_class) setTimeout("setClassName('"+mL+"', '"+off_class+"')", mTo);
  if (mNode.obj.className != soff_class) setTimeout("setClassName('"+mL+"', '"+soff_class+"')", mTo);
}
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

if (mLit.obj.className != off_class) setTimeout("setClassName('"+mL+"', '"+off_class+"')", mTo);
Wenn ich das richtig sehe, dann übergibst du hier mit " + ml + " eine Instanz.
Allerdings kannst du auf diese Methode nur Strings übergeben.

Lösung:
Eine globale Variable anlegen, und die Instanz dann darin zwischenspeichern:
Code:
var oSetClassObj;

function setClassName(class_name)
{
  if (typeof(oSetClassObj) == 'object') {
    oSetClassObj.obj.className = class_name;
  }
}

[...]
  if (mLit.obj.className != off_class) setTimeout("setClassName('"+off_class+"')", mTo);
 

Neue Beiträge

Zurück