globale/lokale Variablen
Lukas
- javascript
Hallo
Ich habe das Problem das eine Variable die ich unbedingt global brauche
nur lokal zugänglich ist, "var" weglasen hat nichts gebracht und
export/import funktioniert ja leider nur mit Objekten, Methoden und
Eigenschaften. Vielen Dank für eure Hilfe!
Code:
<script type="text/javascript">
var request = null;
request = create("test.txt");
request.onreadystatechange = complete;
request.open("GET", "test.txt", true);
request.send(null);
function create(file){
try{
request = new XMLHttpRequest();
}catch(ex){
try{
request = new ActiveXObject("MSXML2.XMLHTTP");
}catch(ex){
request = new ActiveXObject("Microsoft.XMLHTTP");
}
}
return request;
}
function complete(){
switch (request.readyState){
case 0:
case 1:
case 2:
case 3: return;
case 4: out = request.responseText; break;
}
alert(out);
}
alert(out);
</script>
PS beim ersten alert wird der Text korrekt wiedergegeben, beim Zweiten wird
gar nichts angezeigt und die Variable zuvor mit "var out = null;" zu
deklarieren wirft "Null" zurück.
Hi,
PS beim ersten alert wird der Text korrekt wiedergegeben, beim Zweiten wird gar nichts angezeigt
Im Kontext des Zweiten gibt's ja auch ein out.
und die Variable zuvor mit "var out = null;" zu deklarieren
Wo genau probiert?
wirft "Null" zurück.
Was bedeutet das, "wirft zurueck"?
MfG ChrisB
Hi,
Im Kontext des Zweiten gibt's ja auch ein out.
^^^
"kein out" natuerlich.
MfG ChrisB
"kein out" natuerlich.
Ähm was heist im Kontext gibts kein out?
-das "out" noch nicht deklariert wurde?
Danke schonmal
Im Kontext des Zweiten gibt's ja auch ein out
Wenn ich das erste out rausnehme ändert sich auch nichts
Wo genau probiert?
Ganz oben!
Was bedeutet das, "wirft zurueck"?
In der alert-box steht "null"!
Hi,
eine Variable die ich unbedingt global brauche
warum?
Cheatah
Hi,
eine Variable die ich unbedingt global brauche
warum?
Cheatah
Hallo
Weil ich diese variable als array in einer Schleife mehrmal ergänzen
möchte und sie dann per document.write in einer liste anzeigen möchte,
natürlich könnte ich das ganze Script auch in die HTML Datei ziehen
wäre aber sehr unübersichtlich .
Also möchte ich eine Funktion bauen die diese Variable ergänzt und auf
die ich über ein sehr kurzes Script von der HTML Datei zugreifen kann.
So kann ich das "große" Script extern auslagern.
Hi,
Weil ich diese variable als array in einer Schleife mehrmal ergänzen
möchte und sie dann per document.write in einer liste anzeigen möchte,
das erklärt nicht, warum es eine globale Variable sein muss. Übrigens steht ein asynchroner Prozess einem document.write() ziemlich im Weg.
natürlich könnte ich das ganze Script auch in die HTML Datei ziehen
wäre aber sehr unübersichtlich .
Was das damit zu tun haben soll, ist mir ebenfalls nicht klar.
Also möchte ich eine Funktion bauen die diese Variable ergänzt und auf
die ich über ein sehr kurzes Script von der HTML Datei zugreifen kann.
So kann ich das "große" Script extern auslagern.
Gerne. Das hat aber nichts mit globalen Variablen zu tun.
Cheatah
Hallo
Ich versuche jetzt eine klare Antwort zu schreiben !
Das Ziel ist das eine Liste aus einer XML Datei erzeugt wird
zunächst habe ich die Punkte der Liste komplett mit Tags in einer
XML-Datei und das ganze Script zwischen "<ul>" Tags:
Code:
<div style="width:85%; float:left;">
<ul id="ToDo" type="none" id="ul">
<script type="text/javascript">
var out = null;
var request = null;
request = create("tododata.xml");
request.onreadystatechange = complete;
request.open("GET", "tododata.xml", true);
request.send(null);
function create(file){
try{
request = new XMLHttpRequest();
}catch(ex){
try{
request = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
}catch(ex){
request = new ActiveXObject("MSXML2.XMLHTTP");
}
}
return request;
}
function complete(){
switch (request.readyState){
case 0:
case 1:
case 2:
case 3: return;
case 4: var out = request.responseText; break ;
}
document.write(out);
}
</script>
</ul>
</div>
So funktioniert das ganze, jetzt möchte ich aber das Script extern
auslagern und zwischen den <ul> Tags nur noch etwas in der Art haben:
<script type=text/javascript src="main.js"></script>
<script type=text/javascript>
document.write(Listeinträge);
</script>
Wobei Listeinträge in main.js definiert wird, indem aus einer XML-Datei
die punkte ausgelesen werden und dann mit "Listeinträge =+" die Tags
hinzugefügt werden, dafür muss ich die Variable doch global zugänglich
machen, oder etwa nicht ?
-Wann "funtion complete" aufgerufen wird weiss ich, ich hab sie schliesslich geschrieben :-)
Ich habe das Problem das eine Variable die ich unbedingt global brauche
Nein, du möchtest nur zum richtigen Zeitpunkt Zugriff auf eine Variabel haben.
function complete(){
switch (request.readyState){
case 0:
case 1:
case 2:
case 3: return;
case 4: out = request.responseText; break;}
alert(out);
}
complete wird ausgeführt wenn der Request erfolgt und nur dann wird der variabel out ein Wert zugewiesen.
alert(out);
Dieses alert() erfolgt viel früher, da ist out undefniert.
PS beim ersten alert wird der Text korrekt wiedergegeben, beim Zweiten wird
gar nichts angezeigt und die Variable zuvor mit "var out = null;" zu
deklarieren wirft "Null" zurück.
Es kommt nicht auf zuvor und danch an, sondern auf die Reihenfolge der Ausführung und der Code in der Funktion complete() kommt erst am Schluss.
Du musst versuchen von einer linearen Denkweise wegzukommen, JS ist Eventstrukturiert, d.h. viele Dinge passieren nebenläufig und bei AJAX ist das ganz besonders der Fall.
Wenn du also die Variabel out für irgendwas brauchst, musst du dies in der Funktion complete() tun an keiner anderen Stelle.
Struppi.
Ich habe das Problem das eine Variable die ich unbedingt global brauche
Nein, du möchtest nur zum richtigen Zeitpunkt Zugriff auf eine Variabel haben.
function complete(){
switch (request.readyState){
case 0:
case 1:
case 2:
case 3: return;
case 4: out = request.responseText; break;}
alert(out);
}complete wird ausgeführt wenn der Request erfolgt und nur dann wird der variabel out ein Wert zugewiesen.
Genau das ist mein Problem, ich möchte das der Variablen !ab dann! auf
unbestimmte Zeit ein Wert zugewiesen wird, wann Complete ausgeführt wird
weiss ich, ist schließlich mein Script, ich halte nämlich nichts von
script-copy-and-paste
:-)
alert(out);
Dieses alert() erfolgt viel früher, da ist out undefniert.
PS beim ersten alert wird der Text korrekt wiedergegeben, beim Zweiten wird
gar nichts angezeigt und die Variable zuvor mit "var out = null;" zu
deklarieren wirft "Null" zurück.Es kommt nicht auf zuvor und danch an, sondern auf die Reihenfolge der Ausführung und der Code in der Funktion complete() kommt erst am Schluss.
Vergiss "zuvor" das war mehr als "zunächst" gedacht, also Hauptsache
deklariert.
Du musst versuchen von einer linearen Denkweise wegzukommen, JS ist Eventstrukturiert, d.h. viele Dinge passieren nebenläufig und bei AJAX ist das ganz besonders der Fall.
Tut mir leid ich bin erst seit ein paar Tagen dabei mit JS zu arbeiten
aber vieles schaff ich durch Probieren und nachdenken , dieses Problem
allerdings erwischt mich ziemlich hart.
Wenn du also die Variabel out für irgendwas brauchst, musst du dies in der Funktion complete() tun an keiner anderen Stelle.
Das ist aber sehr ungünstig, wenn mann die Variable in einem ganz anderen
Script-teil, in einer anderen Datei braucht!
Hallo Lukas,
vieleicht liege ich falsch, aber ich habe den Verdacht, das du das, was beim asynchronen http-Request passiert, noch nicht richtig verstanden hast. Speziell über die asynchrone Abarbeitung des Requests scheinst du noch nicht richtig nachgedacht zu haben.
In Kurzform: das Script, das den http-Request ausgelöst hat, läuft danach weiter bis zum Ende. Gleichzeitig wird der http-Request abgearbeitet und stellt seine Informationen "irgendwann" zur Verfügung. Danach wird die per "onreadystatechange" angegebene Funktion aufgerufen. Diese kann auf die Informationen zugreifen, nicht aber der Scriptteil, der den Request ausgelöst hat.
Daher kannst du die Informationen auch nicht mit document.write in die Seite schreiben, sondern musst auf die DOM-Methoden zurückgreifen. Eine mögliche Alternative wäre, den http_Request synchron laufen zu lassen.
Gruß, Jürgen
Hallo Lukas,
vieleicht liege ich falsch, aber ich habe den Verdacht, das du das, was beim asynchronen http-Request passiert, noch nicht richtig verstanden hast. Speziell über die asynchrone Abarbeitung des Requests scheinst du noch nicht richtig nachgedacht zu haben.
In Kurzform: das Script, das den http-Request ausgelöst hat, läuft danach weiter bis zum Ende. Gleichzeitig wird der http-Request abgearbeitet und stellt seine Informationen "irgendwann" zur Verfügung. Danach wird die per "onreadystatechange" angegebene Funktion aufgerufen. Diese kann auf die Informationen zugreifen, nicht aber der Scriptteil, der den Request ausgelöst hat.
Daher kannst du die Informationen auch nicht mit document.write in die Seite schreiben, sondern musst auf die DOM-Methoden zurückgreifen. Eine mögliche Alternative wäre, den http_Request synchron laufen zu lassen.
Gruß, Jürgen
Hallo
Es ist mir aber gelungen mit document.write() innerhalb der
funktion Complete die Daten zu schrieben, bzw sie an eine andere Funktion
weiterzugeben, wenn das möglich ist müsste ich diese Daten doch auch ausser-
halb der Funktionen verfügbar machen können, oder ich bin gedanklich einfach
hoffnungslos fest gefahren.
Die DOM-Methoden werde ich mir in jedem Fall mal anschauen und damit etwas
experimentieren !
-- An alle Vielen Dank für eure Hilfe !!!! Ihr seid spitze!!
Nachtrag :
Dom-Elemente sind doch z.B.
document.getElementsByTagName("tagname");
oder
document.getElementById("ID");
oder verdrehe ich da jetzt etwas ?
Hallo Lukas,
Dom-Elemente sind doch z.B.
document.getElementsByTagName("tagname");
oder
document.getElementById("ID");oder verdrehe ich da jetzt etwas ?
nein. Interessant könnten auch noch createElement und appendChild sein. Im Zusammenhang mit AJAX wird auch oft innerHTML verwendet. Du könntest damit alle <li>s, die du per http-Request gelesen hast, in das <ul> schreiben, z.B. über
document.getElementById("ID_des_UL").innerHTML = request.responseText;
Warum in deinem Beispiel document.write funktioniert hat, weiß mich auch nicht.
Gruß, Jürgen
Hallo Lukas,
Dom-Elemente sind doch z.B.
document.getElementsByTagName("tagname");
oder
document.getElementById("ID");oder verdrehe ich da jetzt etwas ?
nein. Interessant könnten auch noch createElement und appendChild sein. Im Zusammenhang mit AJAX wird auch oft innerHTML verwendet. Du könntest damit alle <li>s, die du per http-Request gelesen hast, in das <ul> schreiben, z.B. über
document.getElementById("ID_des_UL").innerHTML = request.responseText;
Super vielen Dank ich werde das mal Probieren und einfach ein paar Versuche
starten das irgendwie zum laufen zu bringen.
Warum in deinem Beispiel document.write funktioniert hat, weiß mich auch nicht.
FIREFOX 3 BETA 4, der magische Browser der alles kann ?? :-)
Es ist mir aber gelungen mit document.write() innerhalb der
funktion Complete die Daten zu schrieben, bzw sie an eine andere Funktion
weiterzugeben, wenn das möglich ist müsste ich diese Daten doch auch ausser-
halb der Funktionen verfügbar machen können, oder ich bin gedanklich einfach
hoffnungslos fest gefahren.
Scheint so.
"Ausserhalb verfügbar machen" ist an sich kein Problem, du meinst damit aber zeitgleich verfügbar machen und das geht nicht. Du kannst erst in der complete Funktion auf out zugreifen und erst dann steht sie ausserhalb zu Verfügung, d.h. du rufst an dieser Stelle die von dir gewünschte Funktion auf. Das ist das Konzept von AJAX (oder allgemein der Eventbasierten Programmierung)
Struppi.
Hallo
Problem halbschön gelöst:
<div style="width:85%; float:left;">
<ul id="ToDo" type="none" id="ul">
<script type="text/javascript">
var request = null;
request = create("test.xml");
request.onreadystatechange = complete;
request.open("GET", "test.xml", true);
request.send(null);
function create(file){
try{
request = new XMLHttpRequest();
}catch(ex){
try{
request = new ActiveXObject("MSXML2.XMLHTTP");
}catch(ex){
request = new ActiveXObject("Microsoft.XMLHTTP");
}
}
return request;
}
function complete(){
switch (request.readyState){
case 0:
case 1:
case 2:
case 3: return;
case 4: list(request.responseXML); break;
}
list(out);
}
function list(dom){
var liste = dom.getElementsByTagName("task");
var prio = dom.getElementsByTagName("prio");
var listen=null;
for(i=0; i<liste.length; i++){
listen = listen + "<li><div style='float:left; width:80%; vertical-align:bottom'>"
listen = listen + liste[i].childNodes[0].nodeValue;
listen = listen + "</div><div style='float:right; width:20%'><img src='png/"
listen = listen + prio[i].childNodes[0].nodeValue;
listen = listen + ".png' class='img'/></div></li>"
}
document.getElementById("ToDo").innerHTML = listen;
}
</script>
</ul>
</div>
Schöner wäre es das ganze extern zu schreiben und dann einzubinden,
scheint aber nicht so leicht zu funktionieren!
Abschließend noch vielen Dank an ALLE