Funktion in setIntervall mit Paramter?

TIMS_Ralf

Erfahrenes Mitglied
Hallo Forum!

möchte die Funktion innerhalb von setIntervall() mit Parameter aufrufen, z.B.:
Ergebnis = setInterval("funktion(" + para1 + "," + para2 + "," + para3 + ")", 100);

Es funktioniert alles wenn ich die Funktion ohne Parameter aufrufe und sie dort statisch definiere.
Ergebnis = setInterval("funktion()", 100);

Parameter werden vorher definiert, keine Fehler! Aufgerufene Funktion auch keine Fehler. Der Fehler taucht beim Aufruf von setIntervall auf - und die Fehlerkonsole läuft mir endlos voll: "para1 is not defined".

Für Gucken und Tipps vielen Dank!
Ralf
 
So wie du es im Moment schreibst, wird der Inhalt der drei Variablen als Bezeichner der zu übergebenen Variablen verwendet.

Je nach dem was du erreichen willst, musst du es anders schreiben.

1. Du willst die Variablen para1, para2, para3 mit Ihrem zum jeweiligen Aufruf gültigen Wert im Funktionsaufruf benutzen:
Javascript:
setInterval(function() {
    funktion(para1, para2, para3);
}, 100);

2. Du willst die Werte von para1, para2 und para3, welche Sie beim Aufruf von setInterval hatten immer wieder übergeben bekommen.

Javascript:
setInterval("funktion('" + para1 + "','" + para2 + "','" + para3 + "')", 100);


Am Besten zeigst du uns mal den Funktionskopf von "funktion" und auch die Zeilen vor dem setInterval Aufruf (die Definitionen der Variablen para1-para3)
 
Hallo CPoly,

zuerst für Deine SUPER-Antwort und Tipps VIELEN Dank! Bei 1. Variante steig ich noch nbicht ganz durch, aber die 2. dürfte ****en - klar muß ich mit verschachtelten Anführungszeichen arbeiten. Checke das übers Wochenende - sag beischeid :)

Aktueller Codes:
Möchte einen DIV-Panel bauen, der auf Click aus- und einfährt.
Vars mit "_" sind globale Variablen
Funktion getObjbyID(...) gibt aus getElementById() das HTML-Objekt zurück, oder Fehler, falls Objekt / ID nicht im Doc.

1. Aufrufende Funktion:
Code:
// Globale Variablem
var SldIntvl = 0;         // Sliding Panel Intervall ID
var isSldg = false;       // Panel is Sliding ? TRUE / FALSE

function doPnl(mode, SldPnlID, SldStp, wtMSec, zIdx, SldStt, EndVal)    
{
 /*
 mode:     tD , tR , tL , tU
 SldPnlID: ID des Panels das geslided werden soll 
 SldStp:   Speed - wie schnell isSldg? soll % verändert werden
 wtMSec:   Pause bis Intervall wiederholt wird 
 zIdx:     z-Index 1=Layer=8010, 0=nichts= HTML-Elemente werden beim Slide verschoben 
 EndVal:   End-Größe des Panels (Höhe oder Breite, je nach mode )
 */
 var
 PnlHdImgInfo = new Image(16,16),
 PnlHdImgOpCl = new Image(16,16),
 IDPnlIFr, PnlIFr,
 scrpt = "all/pg/_dev/sldpnl.js - doPnl()";
 
 IDSldPnl = "SldPnl" + SldPnlID;
 IDPnlImgInfo = "PnlImgInfo" + SldPnlID;
 IDPnlImgOpCl = "PnlImgOpCl" + SldPnlID;
 IDPnlIFr = "PnlIFrm" + SldPnlID;
 /*
 alert("IDs:" +
       "\n IDSldPnl = " + IDSldPnl +
       "\n IDPnlImgInfo = " + IDPnlImgInfo +
       "\n IDPnlImgOpCl = " + IDPnlImgOpCl +
       "\n IDPnlIFr = " + IDPnlIFr +
       "\nEnde IDs");
 */
 SldPnl = getObjbyID(IDSldPnl, scrpt, "IDSldPnl");
 PnlIFr = getObjbyID(IDPnlIFr, scrpt, "IDPnlIFr");
 PnlImgInfo = getObjbyID(IDPnlImgInfo, scrpt, "IDPnlImgInfo");
 PnlImgOpCl = getObjbyID(IDPnlImgOpCl, scrpt, "IDPnlImgOpCl");
 /*
 alert("AnzErr = " + _AnzErr +
       "\nObjekte:" +
       "\n SldPnl = " + SldPnl +
       "\n PnlImgInfo = " + PnlImgInfo +
       "\n PnlImgOpCl = " + PnlImgOpCl +
       "\n PnlIFr = " + PnlIFr +
       "\nEnde Objekte");
 */
 if(_AnzErr==0)
 {
  if(isSldg) return;
  isSldg = true;
  if(SldStt == EndVal) 
  {
   alert("Ausblenden: Aufruf HdPnl()" +
         "\n IDSldPnl = " + IDSldPnl +
         "\n SldStp = " + SldStp +
         "\n EndVal = " + EndVal +
         "\n scrpt = " + scrpt +
         "\nEnde Parameter");
   SldIntvl = setInterval('"HdPnl(" + IDSldPnl + "," + SldStp + "," + EndVal + "," + scrpt + ")"', wtMSec);
   // SldPnl.style.display = "none";
  }
  else
  {
/*
   alert("Einblenden: Aufruf ShwPnl()" +
         "\n IDSldPnl = " + IDSldPnl +
         "\n SldStp = " + SldStp +
         "\n EndVal = " + EndVal +
         "\n scrpt = " + scrpt +
         "\nEnde Parameter");
*/
   SldPnl.style.display = "block";
   if(zIdx>=1) SldPnl.style.zIndex = 8010;
   SldIntvl = setInterval('"ShwPnl(" + IDSldPnl + "," + SldStp + "," + EndVal + "," + scrpt + ")"', wtMSec);
  }
 }
 else
 {
  Err(AnzErr,scrpt,ErrTxt,0);
 }
}

Code der aufgerufenen Funktion:
Code:
function HdPnl(IDSldPnl, SldStp, EndVal, FromScrpt)                                   // Panel einfahren
{
 var
 SldPnl,
 SldStt,
 scrpt="all/pg/sldPnl - fct HdPnl(" + IDSldPnl + "," + SldStp + "," + EndVal + "," + FromScrpt +"),\n Aufruf durch : " + FromScrpt,
 EndVar=true;
 
 
 SldPnl = document.getElementById(IDSldPnl);           // Element als Objket (durch Funktion ersetzen)
 SldStt = SldPnl.style.height;

 if(SldStt <= 0)                                       // Panel slided nicht mehr
 {
  isSldg = false;                                      // slide = false
  SldStt = 0;                                          // Variable für Höhe zurück setzen
  SldPnl.style.height = "0px";                         // Höhe zurück setzen
  // SldPnl.style.display = "none";
  clearInterval(SldIntvl);                             // Intervall zurück setzen
 }
 else                                                  // Panel ist noch am sliden... slided noch
 {
  SldStt -= SldStp;                                    // Höhe um SldStp reduzieren
  if(SldStt < 0) SldStt = 0;                           // Höhe < Null vermeiden
  SldPnl.style.height = SldStt + "px";                 // Aktuelle Höhe setzen
 }
}

Ist natürlich noch nicht fertig, (Images, angepasst schnelles Sliden... fehlen noch), gibt Euch aber gewünschte Infos damit HdPnl überhaupt mal aufgerufen werden kann.

Danke!
Gruß Ralf
 
Zuletzt bearbeitet:
Hier brauchst du bestimmt noch ein parseInt

Javascript:
SldStt = parseInt(SldPnl.style.height);

Zur 1. Variante: Du kannst den ganzen Code in eine Anonyme Funktion stecken, anstatt alles als String anzugeben. Das macht dir Arbeit mit Parametern erheblich einfacher.

Versuchs mal so (konnte es nicht testen, da ich nicht weiß, wie ich deinen Code zu benutzen habe).

Javascript:
//Vorher
SldIntvl = setInterval('"HdPnl(" + IDSldPnl + "," + SldStp + "," + EndVal + "," + scrpt + ")"', wtMSec);

//Nachher
SldIntvl = setInterval(function() {
    HdPnl(IDSldPnl, SldStp, EndVal, scrpt);
}, wtMSec);


Übrigens finde ich deine Namensgebung schrecklich. Schreib sie doch lieber aus. Wenn es dir um das einsparen von Bytes geht, kannst du den Code am Ende immer noch komprimieren (z.B. http://code.google.com/closure/).
 
Hi CPoly,

werde beide Varianten probieren und reporten... bis dahin: Super und vielen Dank!

parseInt: Ja klar, Gimmicks und Aufbesserungen kommen noch, muss erstmal den Funktionsaufruf in Aufruf des setIntervall hinbekommen. Variante 2 hab ich verstanden - sehr elegant :-) hänge aber noch am gleichen Fehler. Melde mich.

Namensgebung :-) ... Ja, sieht krypisch aus. Wenn man sich an dergleichen Kurzformen gewöhnt hat, liest sich das ebenso schnell, wie ein Buchtext. Als ich studierte, gings das nur so und gar nicht anders. :-))) Es hat 2 Vorteile:
- Die Scriptgröße
- Auch lange Codezeilen sind noch in einer Zeile ohne nerviges Scrollen zu sehen.
- Die "Kürzel" werden bei uns konsequenmt mit Code-Legende durchgezogen, für JS, CSS, PHP, SQL...
Aber hast recht: Am Anfang schimpft jeder :-)

Zur Codecomprimierung und "Verschleirung" nutze ich http://www.javascript-source.com Der macht das gleiche, kann aber auch komplette Projekte (mehrere JS-Files) handeln. Kost zwar Geld, läuft aber super, JS-Editor: http://www.yaldex.com/JSFactory_Pro.htm (naja....).

So long und vielen Dank bis dahin für Mühe, Tipps...
Gruß aus dem Harz
Ralf
 
Hallo CPoly,

wie versprochen, die Rückmeldung und danke für Deine Tipps und konkrete Antwort. Das laufende Script... Interessanter Weise dauert der Slide-Intervall etwa 3 mal so lange, wenn ich ihn mit der eleganten Variante der "Anonymen Funktion aufrufe", statt als String mit verschachtelten Anführungszeichen zu übergeben.

Die "String-Variante" ist auskommentiert. Der parseInt ist natürlich drin, einige Gimmicks fehlen zwar noch, aber das Problem ist gelöst. Variablen mit führendem "_" sind globale Variablen, die var-Benennungen sind zwar kryptisch, aber "sprechend", wenn man sich dran gewöhnt hat :-)

Der Code:
Code:
var doSld = 0;
var isPnlSldg = false;

function doPnlSld(mode, SldPnlID, SldPnlEnd, SldSpd, wtMSec, zIdx, IFrPg)
{
 /*
 Paramter
 mode:      TD = Top to Down, LR = Left to Right, RL = Right to Left, BU = Bottom Top Up
 SldPnlID:  ID des Panels das geslided werden soll 
 SldPnlAkt: Aktuelle Größe (Höhe oder Breite) des Panels
 SldPnlEnd: End-Größe des Panels (Höhe oder Breite), negativ bei BU und RL
 SldSpd:    Sliding Speed - wie schnell isPnlSldg? Je kleiner desto schneller ( 20 )
 wtMSec:    Wait / Pause bis Intervall wiederholt wird in Millisekunden
 zIdx:      CSS z-Index 1=Layer=8010, 0/LEER: Elemente werden beim Slide verschoben)
 */
 var
 PnlHdImgInfo = new Image(16,16),
 PnlHdImgOpCl = new Image(16,16),
 IDPnlIFr, PnlIFr, IFrPgLd, IFrLnk,
 scrpt = "all/pg - doPnlSld("+mode+","+SldPnlID+","+SldPnlEnd+","+SldSpd+","+wtMSec+","+zIdx+","+IFrPg+")",
 IDSldPnl = "SldPnl" + SldPnlID,
 IDPnlIFr = "PnlIFrm" + SldPnlID,
 IDPnlImgInfo = "PnlImgInfo" + SldPnlID,
 IDPnlImgOpCl = "PnlImgOpCl" + SldPnlID,
 EndVar = true;
 
 SldPnl = getObjbyID(IDSldPnl, scrpt, "IDSldPnl");
 PnlIFr = getObjbyID(IDPnlIFr, scrpt, "IDPnlIFr");
 PnlImgInfo = getObjbyID(IDPnlImgInfo, scrpt, "IDPnlImgInfo");
 PnlImgOpCl = getObjbyID(IDPnlImgOpCl, scrpt, "IDPnlImgOpCl");
 
 if(_AnzErr==0)
 {
  if(isPnlSldg) return;
  isPnlSldg = true;
  
  if(zIdx > 0) SldPnl.style.zIndex = "8010";
  SldPnlAkt = parseInt(SldPnl.style.height);
  if(SldPnlAkt == SldPnlEnd) //  || SldPnl.style.display == "none"
  {
   PnlIFr.style.display = "none";
   doSld = setInterval(function() {ClSldPnl(mode, IDSldPnl, SldPnlEnd, SldSpd, scrpt);}, wtMSec);
   // doSld = setInterval("ClSldPnl('" + mode + "','" + IDSldPnl + "','" + SldPnlEnd + "','" + SldSpd + "')", wtMSec);
   switch(mode)
   {
    case "TD":
    {
     PnlImgOpCl.src = _ImgPthPnlDOut;
     break;
    }
    case "RL":
    {
     break;
    }
    case "BU":
    {
     break;
    }
    case "LR":
    {
     PnlImgOpCl.src = _ImgPthPnlROut;
     break;
    }
    default:
    {
     _AnzErr++;
     _ErrTxt = _ErrTxt + "\nUngültiger Paramter für >mode< = " + mode + " in " + scrpt;
    }
   }
  }
  else
  {
   SldSpd = SldSpd/10;
   SldPnl.style.height = "0px";
   PnlIFr.style.display = "none";
   SldPnl.style.display = "block";
   doSld = setInterval(function() {OpSldPnl(mode, IDSldPnl, SldPnlEnd, SldSpd, scrpt);}, wtMSec);
   // doSld = setInterval("OpSldPnl('" + mode + "','" + IDSldPnl + "','" + SldPnlEnd + "','" + SldSpd + "')", wtMSec);
   PnlIFr.style.display = "block";
   switch(mode)
   {
    case "TD":
    {
     PnlImgOpCl.src = _ImgPthPnlUOut;
     break;
    }
    case "RL":
    {
     break;
    }
    case "BU":
    {
     break;
    }
    case "LR":
    {
     PnlImgOpCl.src = _ImgPthPnlLOut;
     break;
    }
    default:
    {
     _AnzErr++;
     _ErrTxt = _ErrTxt + "\nUngültiger Paramter für >mode< = " + mode + " in " + scrpt;
    }
   }
  }
  PnlIFr.src = IFrLnk;
 }
 else
 {
  Err(AnzErr,scrpt,ErrTxt,1);
 }
}



Vielen Dank!
Gruß Ralf

P.S.: und als neuer Thread gleich das nächste Problemchen :-)
 
Zuletzt bearbeitet:
Zurück