HighDots Forums  

Parameteruebergabe

Javascript (German) Programmiersprache JavaScript. (de.comp.lang.javascript)


Discuss Parameteruebergabe in the Javascript (German) forum.



Reply
 
Thread Tools Display Modes
  #1  
Old   
Ralf Weber
 
Posts: n/a

Default Parameteruebergabe - 10-06-2004 , 09:51 AM






Hallo,

ich habe ein kleines Skript erstellt. Dabei rufe ich von der HTML-Seite
eine Funktion aus der JS-Datei auf mit Parametern. Soweit so gut, jedoch
bei der Weitergabe dieser an die Funktion setInterval kommt die
Fehlermeldung, dass die Variable nicht definiert ist.

var activ;

function test(c,t)
{
//
window.clearInterval(activ);
}

function start(count,text)
{
activ = setInterval("test(count,text)",1000);
}

Ich brauche die Uebergabe um der Funktion Test ein DIV-Element zu
uebergeben um daran Aenderungen vorzunehmen. Beim Aufruf in setInterval
sind die Parameter ploetzlich nicht mehr definiert.
Wieso das?

MfG, Ralf...

Reply With Quote
  #2  
Old   
Dietmar Meier
 
Posts: n/a

Default Re: Parameteruebergabe - 10-06-2004 , 09:54 AM






Ralf Weber <RalfWeb1 (AT) gmx (DOT) de> typed:

Quote:
function start(count,text)
{
activ = setInterval("test(count,text)",1000);
}
[...] Beim Aufruf in
setInterval sind die Parameter ploetzlich nicht mehr definiert.
Deine Anweisung "test(count,text)" wird im Globalen Kontext
(Scope von window) ausgeführt, Deine Bezeichner "count" und
"text" sind hingegen nur im Scope der Funktion "start" bekannt
(Funktionsargumente sind je nach JS-Implementierung lokale
Variable der Funktion oder Eigenschaften der Funktion, nicht
aber Eigenschaften des Globalen Objekts (window)).

Abhilfe bietet eine Closure, das funktioniert allerdings nur bei
JS-Versionen, die verschachtelte Funktionen kennen und die ein
Funktionsobjekt als erstes Argument von setInterval erlauben.
Hierbei sind dann "count" und "text" innerhalb der anonymen
Funktion auch nach Beendigung von start() bekannt:

function start(count, text) {
activ = setInterval(function() {
test(count,text);
}, 1000);
}

ciao, dhgm



Reply With Quote
  #3  
Old   
Daniel Kirsch
 
Posts: n/a

Default Re: Parameteruebergabe - 10-06-2004 , 09:55 AM



Ralf Weber wrote:
Quote:
Ich brauche die Uebergabe um der Funktion Test ein DIV-Element zu
uebergeben um daran Aenderungen vorzunehmen. Beim Aufruf in setInterval
sind die Parameter ploetzlich nicht mehr definiert.
Wieso das?
Weil die Funktion setInterval den ersten Parameter als Funktionsinhalt
interpretiert und diese Funktion keine Ahnung von den definierten
Variablen der ersten Funktion hat.
Du könntest globale Variablen verwenden und auf diese Zugreifen:

function start(count,text)
{
window["intervalCount"] = count;
window["intervalText"] = text;
activ = setInterval("test(intervalCount,intervalText)",100 0);
}

Grüße
Daniel


Reply With Quote
  #4  
Old   
Ralf Weber
 
Posts: n/a

Default Re: Parameteruebergabe - 10-06-2004 , 10:39 AM



Hallo Dietmar,
zu deinem Posting (Wed, 6 Oct 2004 16:54:23):

Quote:
function start(count, text) {
activ = setInterval(function() {
test(count,text);
}, 1000);
}
Aha, danke...


Reply With Quote
  #5  
Old   
Daniel Kirsch
 
Posts: n/a

Default Re: Parameteruebergabe - 10-06-2004 , 10:47 AM



Ralf Weber wrote:
Quote:
So wie ich es jetzt aufgeschrieben habe funktioniert es nicht. Der
Intervall-Zeitgeber laeuft weiter nach dem clearInterval!?
Verstehe ich nicht!
Wo initialisierst Du denn den Wert i? Der sollte eigentlich in start()
mit i=0; definiert werden, das sehe ich in Deinem Script aber nicht.
Lass Dir mal den Wert von i in Deiner Funktion test() ausgeben.
Vermutlich steht da NaN drin.

Grüße
Daniel


Reply With Quote
  #6  
Old   
Ralf Weber
 
Posts: n/a

Default Re: Parameteruebergabe - 10-06-2004 , 10:47 AM



Hallo Daniel,
zu deinem Posting (Wed, 06 Oct 2004 16:55:19):

Quote:
Du könntest globale Variablen verwenden und auf diese Zugreifen:

function start(count,text)
{
window["intervalCount"] = count;
window["intervalText"] = text;
activ = setInterval("test(intervalCount,intervalText)",100 0);
}
Okay, danke! Das funktioniert auch bis auf eine Kleinigkeit. In der
Funktion Test, welche ja jetzt per Intervall aufgerufen wird, steht eine
Abfrage zum intervalCount. Wenn eine globale Variable, die ich hochzaehle
denn Wert erreicht soll window.clearInterval(activ) aufgerufen werden.
Also in dieser Form:

var activ;
var i;

function test(count,text)
{
//
i=i+1;
if(i>intervalCount) window.clearInterval(activ);
}

function start(count,text)
{
window['intervalCount'] = count;
window['intervalText'] = text;
activ = window.setInterval(intervalCount,intervalText),500 );
}

So wie ich es jetzt aufgeschrieben habe funktioniert es nicht. Der
Intervall-Zeitgeber laeuft weiter nach dem clearInterval!?
Verstehe ich nicht!
Normalerweise muesste doch ein z.B.: 10-maliger Aufruf das Intervall
beenden mit folgendem Aufruf:
start(10,'Test');

MfG, Ralf...


Reply With Quote
  #7  
Old   
Ralf Weber
 
Posts: n/a

Default Re: Parameteruebergabe - 10-06-2004 , 11:25 AM



Hallo Daniel,
zu deinem Posting (Wed, 06 Oct 2004 17:47:14):

Quote:
Wo initialisierst Du denn den Wert i? Der sollte eigentlich in start()
mit i=0; definiert werden, das sehe ich in Deinem Script aber nicht.
Lass Dir mal den Wert von i in Deiner Funktion test() ausgeben.
Vermutlich steht da NaN drin.
Ich habe die Variable in meinem Skript intialisiert, hatte nur hur das = 0
vergessen. Das Problem liegt glaube ich woanders: Die Funktion start wird
beim onmouseover-Ereignis aufgerufen und solange die Maus noch innerhalb
des DIV-Elements steht wird dann auch wieder die Funktion start aufgerufen
unabhaengig davon, ob der Zaehler vorher schon erreicht war oder nicht.
Habe das Ganze mit einer Boolean-Variable ausgebessert (init = false ;
erster Aufruf => true) doch jetzt habe ich ein anderes Problem:
Wird waehrend der Verarbeitung der Intervalle ein onmouseout-Ereignis
abgefangen? Es scheint nicht so!
Nochmal zum Gesamtproblem:
Beim onmouseover-Ereignis soll eine Funktion eine 'Animation'
(Verschiebung) eines Elements beginnen und beim onmouseout das Ganze wieder
zurueck. Mit der oben erwaehnten Boolean-Variablen wird die Animation jetzt
nur einmal ausgefuehrt jedoch erkennt JS in dieser Zeit das
onmouseout-Ereignis nicht!?

Mfg, Ralf...


Reply With Quote
  #8  
Old   
Daniel Kirsch
 
Posts: n/a

Default Re: Parameteruebergabe - 10-06-2004 , 11:37 AM



Ralf Weber wrote:
Quote:
Wird waehrend der Verarbeitung der Intervalle ein onmouseout-Ereignis
abgefangen? Es scheint nicht so!
Eigentlich schon, setze doch ein alert und prüfe es. Deine aktuell
laufende Funktion test() in der vermutlich die Animation läuft wird
dadurch aber nicht unterbrochen. Vielleicht ist da ein Denkfehler. ggf.
kannst Du auch mal eine URL zum Problem posten.

Grüße
Daniel


Reply With Quote
  #9  
Old   
Thomas 'PointedEars' Lahn
 
Posts: n/a

Default Re: Parameteruebergabe - 10-06-2004 , 11:48 AM



Dietmar Meier wrote:

Quote:
Ralf Weber <RalfWeb1 (AT) gmx (DOT) de> typed:
function start(count,text)
{
activ = setInterval("test(count,text)",1000);
}
[...] Beim Aufruf in
setInterval sind die Parameter ploetzlich nicht mehr definiert.

[...]
Abhilfe bietet eine Closure, das funktioniert allerdings nur bei
JS-Versionen, die verschachtelte Funktionen kennen und die ein
Funktionsobjekt als erstes Argument von setInterval erlauben.
Hierbei sind dann "count" und "text" innerhalb der anonymen
Funktion auch nach Beendigung von start() bekannt:

function start(count, text) {
activ = setInterval(function() {
test(count,text);
}, 1000);
}
Oder bis JavaScript 1.0/JScript 1.0/ECMAScript 1 abwärtskompatibel so:

var o;

function test(c, t)
{
alert([c, t]);
clearTimeout(o.activ);
}

function start(count, text)
{
// je nach Kompatibilitätbedingung auch als Object-Literal
o = new Object();
o.c = count;
o.t = text;
o.activ = window.setTimeout("test(o.c, o.t);", 1000);
}

start(1337, "42");

(So ähnlich gesehen in cljs.)


PointedEars
--
Der Krieg ist das Resultat der Wahnidee, dass man aus den Mündungsrohren der
furchtbareren Kanonen und der effizienteren Raketensilos Recht herbeibomben
könnte. Der Krieg ist das Scheitern, Menschen gerecht zu werden.
-- Eugen Drewermann, dt. Theologe, Februar 2003


Reply With Quote
  #10  
Old   
Daniel Kirsch
 
Posts: n/a

Default Re: Parameteruebergabe - 10-06-2004 , 11:57 AM



Daniel Kirsch wrote:
Quote:
function start(count,text)
{
window["intervalCount"] = count;
window["intervalText"] = text;
activ = setInterval("test(intervalCount,intervalText)",100 0);
}
Oder natürlich
activ = setInterval("test(" + count + "," + text + ")",1000);

Grüße
Daniel


Reply With Quote
Reply




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off



Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.