Archivlink: javarea.de Forum > JavaScript > ...is not defined
Vollständigen Link anzeigen: javarea.de Forum > JavaScript > ...is not defined
Pages: [1]
| geschrieben von mosi am 21.09.2008 - 19:24 |
Hallo,
ich arbeite normalerweise kaum mit JavaScript, deshalb bin ich nicht mit dessen Eigenheiten vertraut und fall hin und wieder auf die Nase. Ich hab nen kleines Problem und finde den Fehler nicht. Dazu einfach mal folgender kleiner Codeschnipsel:
| HTML-Quelltext | 1:
2:
3:
4:
| function send_contact_form () {
var req = new Cajax();
var active = window.setInterval("req.awaitResponse('ContactStatus')", 1000); //X
} // send_contact_form () |
Ich bekomme nun die meldung, dass in der mit X markierten Zeile req nicht definiert wäre. was ich nicht verstehe, hab ich doch dadrüber getan? Wenn ich die beiden zeilen einfach mal in die Console des Firebugs übertrage funktioniert es auch alles wunderbar (soll heißen, der rest sollte korrekt implementiert sein). |
| geschrieben von Micha am 21.09.2008 - 22:16 |
Hi,
auf die Schnelle ist mir das eingefallen:
| HTML-Quelltext | 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
| function send_contact_form () {
var req = new Object();
req.awaitResponse = function(str) {
window.alert(str);
}
var self = this;
self.req = req;
var active = window.setTimeout(function() { self.req.awaitResponse("ContactStatus"); }, 1000); //X
}
send_contact_form (); |
Micha |
| geschrieben von mosi am 21.09.2008 - 22:29 |
Hallo Micha, danke für deine Antwort.
Ich versuche da grad durchzusteigen, sehe aber ein kleines Problem mit meinem "Konzept". Wenn ich das richtig verstehe, erzeuge ich in deinem Beispiel das Objekt in der Funktion send_contact_form. Mein Ansinnen war es allerdings dieses Objekt (das gleiche, nicht das selbe o.O) noch an ein, zwei anderen Stellen zu benutzen. Irgendwie find ich die Objektorientierung in JS komisch. Na, ich werd nochmal etwas kniffeln vielleicht bekomme ich es ja irgendwie hin. |
| geschrieben von Micha am 21.09.2008 - 22:34 |
Hi,
ich musste ja erstmal ein Objekt erzeugen. Wo das nun passiert, ist egal. Bei Dir muss der Teil mit new Object() usw. wieder raus. Dein Code war aber unvollständig - sprich, es gabe kein Cajax-Objekt mit einer Methode awaitResponse. Wie sollte ich also ein funktionierendes Beispiel erzeugen? Eben, geht nicht; daher habe ich fix selbst ein Objekt hinzugefügt. Der Teil kann also weg bei Dir bzw. muß ersetzt werden.
Micha |
| geschrieben von Micha am 21.09.2008 - 22:37 |
... achja und aus Timeout muß wieder das Intervall rein; ein alert im Sekundentakt war mir aber zu blöd  |
| geschrieben von mosi am 21.09.2008 - 22:51 |
Ah, ok, dann war das ein Missverständnis. Dank deinem Snippet funktioniert das Starten des Intervalls jetzt. Allerdings will die Abbruchbedingung clearInterval() nicht greifen, weil active nicht definiert ist... . Das nehm ich ihm sogar ab, aber mir fällt nichts besseres ein und der Ansatz stammt aus selfhtml.
| HTML-Quelltext | 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
| function Cajax () {
var req = null;
this.i = 0;
// [snip ....]
this.response_open = function (id, css) {
if (this.i == 0) {
// [snip ...]
} // else
this.i ++;
if (this.i == 10)
window.clearInterval(active); // XXX
} // responseOpen ()
// [snip ...]
// --> Pseudo-Konstruktor
req = mk_req_object ();
} // Cajax
/* CONTACT ********************************
*
*/
function send_contact_form () {
var req = new Cajax();
var self = this;
self.req = req;
var active = window.setInterval(function () {
self.req.response_open('ContactStatus', 'AjaxResponseWait'); }, 50);
} // send_contact_form () |
|
| geschrieben von Micha am 21.09.2008 - 23:00 |
Hi,
in selfhtml steht es falsch?
Nun ja, ich denke nicht. Wenn Du eine Variable lokal deklarierst in einer Funktion, ist sie nunmal nicht zugänglich in anderen. Entweder, Du machst sie global oder gibst sie Deinem Objekt mit:
| HTML-Quelltext | 1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
| function Cajax () {
var req = null;
this.i = 0;
this.active = null;
// [snip ....]
this.response_open = function (id, css) {
if (this.i == 0) {
// [snip ...]
} // else
this.i ++;
if (this.i == 10)
window.clearInterval(this.active); // XXX
} // responseOpen ()
// [snip ...]
// --> Pseudo-Konstruktor
//req = mk_req_object ();
} // Cajax
/* CONTACT ********************************
*
*/
function send_contact_form () {
var req = new Cajax();
var self = this;
self.req = req;
req.active = window.setInterval(function () {
self.req.response_open('ContactStatus', 'AjaxResponseWait'); }, 50);
} send_contact_form (); |
Micha |
| geschrieben von mosi am 21.09.2008 - 23:11 |
Ok, darauf hätte ich auch selber kommen können ~ Forennutzung fördert Bequemlichkeit. Vielen Dank, klappt jetzt super. Mitlerweile hab ich auch den ersten Teil gerallt... .
@selfhtml: das es da falsch steht hab ich nicht gesagt. Jedoch sind die Beispiele da ja mitunter recht trivial (was ja auch sinnvoll ist). Wenn ich nun aber versuche diese Sachen nach meinen schon recht speziellen Vorstellungen umzubiegen rappelts oft, dazu mach ich einfach zu selten etwas mit JS. Das Beispiel http://de.selfhtml.org/javascript/o....t_interval hier hat nen Missverständnis was die globalen Variablen betrifft ausgelöst.
ABER jetzt hab ichs ja =) Danke nochma zur vortgeschrittenen Stunde. |
| geschrieben von Micha am 21.09.2008 - 23:17 |
Hallo,
| Zitat von: mosi am 21.09.2008 - 23:11 | | |
Ok, darauf hätte ich auch selber kommen können
|
Da bin ich mir auch ziemlich sicher, wo es doch so nahe liegt 
Bei SELFHTML wird aktiv auch global erzeugt und ist daher verfügbar. Lokale Variablen haben aber deutlich mehr Vorteile gerade, wenn man mehr als nur ein Script laufen hat und (unglücklicherweise) Variablen gleiche Namen haben... Wie dem auch sei, nun läuft es ja. Vll zum weiterlesen: http://aktuell.de.selfhtml.org/arti....anisation/
Gruß Micha
|
|