WinFuture-Forum.de: JavaScript - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

JavaScript JavaScript, Variable, Übergabe


#1 Mitglied ist offline   FellFroscH 

  • Gruppe: aktive Mitglieder
  • Beiträge: 30
  • Beigetreten: 12. Dezember 07
  • Reputation: 0

geschrieben 09. Juni 2011 - 17:48

Hallo Forum,

ich komme einfach nicht weiter, angeblich soll ich zwar alles richtig machen aber es geht einfach nicht...
Ich versuche aus einer Website Informationen (JSON) auszulesen, was auch schon mal geht.
Dann Konvertier ich den Spaß von JSON zu JS Objekt, geht auch.
Und als letztes will ich die Variable übergeben...geht aber nicht...undefiniert...

js.js
function GetInfo() {
	var myJSONObject; //*
	var URL = "sag_ich_nicht.com";
	var req = new XMLHttpRequest();
	req.open("GET", URL);
	
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			myJSONObject = JSON.parse(req.responseText); //**
#
		}
	}
	req.send(null);
##
	return myJSONObject;
}


test.html
alert(GetInfo());


** Schon hier wird die Variable die am anfang (*) von GetInfo() deklariert wurde nicht verwendet
# Wenn ich hier per alert() die Variable ausgebe ist alles in Ordnung.
## Geben ich hier die Variable per alert() aus heist es undefiniert

Danke für Eure Hilfe
0

Anzeige



#2 Mitglied ist offline   aeris 

  • Gruppe: aktive Mitglieder
  • Beiträge: 129
  • Beigetreten: 06. September 08
  • Reputation: 12
  • Geschlecht:unbekannt

geschrieben 09. Juni 2011 - 18:12

Du definiest myJSONObject in einem anderen Scope.

Die Funktion die bei "onreadystatechange" aufgerufen wird kennt die Variable nicht und definiert sie daher im eigenen Scope neu, danach wird sie wieder verworfen.

Definiere myJSONObject ausserhalb der GetInfo Funktion.
0

#3 Mitglied ist offline   FellFroscH 

  • Gruppe: aktive Mitglieder
  • Beiträge: 30
  • Beigetreten: 12. Dezember 07
  • Reputation: 0

geschrieben 10. Juni 2011 - 12:30

Habe die Variable außerhalb deklariert, leider heißt es immer noch "undefined".

js.js
function GetInfo() {
	var URL = "sag_ich_nicht.com";
	var req = new XMLHttpRequest();
	req.open("GET", URL);
	
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			var myJSONObject = JSON.parse(req.responseText);
		}
	}
	req.send(null);
	return myJSONObject;
}


test.html
		var myJSONObject;
		GetInfo();


Noch eine Idee parat?
Danke
0

#4 Mitglied ist offline   aeris 

  • Gruppe: aktive Mitglieder
  • Beiträge: 129
  • Beigetreten: 06. September 08
  • Reputation: 12
  • Geschlecht:unbekannt

geschrieben 10. Juni 2011 - 13:44

Ups. Sehe gerade, dass kann ja gar nicht funktionieren.
Der Ajax request benötigt ja etwas Zeit bis er ausgeführt worden ist, in der hat die Funktion "myJSONObject" schon leer zurückgegeben.

Du darfst also erst weitermachen, wenn der Request beendet worden ist.

Beispiel:
var GetInfos = function(callback) {
	var URL = "sag_ich_nicht.com";
	var req = new XMLHttpRequest();
	req.open("GET", URL);
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			callback(JSON.parse(req.responseText));
		}
	}
	req.send(null);
}

GetInfos(function(myJSONObject) {
	alert(myJSONObject);
	//weiter hier...
});

0

#5 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 10. Juni 2011 - 14:33

Korrekt, das Problem ist, dass das asynchron abläuft. Allerdings muss man festhalten, dass das der Sinn und Zweck des XHR-Objektes ist.
0

#6 Mitglied ist offline   FellFroscH 

  • Gruppe: aktive Mitglieder
  • Beiträge: 30
  • Beigetreten: 12. Dezember 07
  • Reputation: 0

geschrieben 10. Juni 2011 - 15:32

Ok, so weit so gut - ja jetzt kommt’s - mit den besch***** Variablen komme ich aber immer noch nicht weiter, ich bekomme weiterhin die Meldung undefiniert.
Und es gibt noch eine Fehlermeldung bei deinem Vorschlag. -> Objekt erwartet*

js.js
var GetInfo =  function(callback) {
	var URL = "sag_ich_nicht.com";
	var req = new XMLHttpRequest();
	req.open("GET", URL);
	
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			callback(JSON.parse(req.responseText)); *// Objekt erwartet
		}
	}
	req.send(null);
}

GetInfo(function(myJSONObject) {
	//alert(myJSONObject);
	username = myJSONObject.username;
//alert(username) funktioniert
});


test.html
		var username;
		GetInfo();
		alert(username) // undefiniert

0

#7 Mitglied ist offline   aeris 

  • Gruppe: aktive Mitglieder
  • Beiträge: 129
  • Beigetreten: 06. September 08
  • Reputation: 12
  • Geschlecht:unbekannt

geschrieben 11. Juni 2011 - 09:21

Ja so geht das auch nicht. Wie Witi bereits gesagt hatte läuft der Request asynchron, wenn du alert(username) machst, wurde der Request noch nicht ausgeführt, deswegen auch der Callback.

js.js
var GetInfo =  function(callback) {
	var URL = "sag_ich_nicht.com";
	var req = new XMLHttpRequest();
	req.open("GET", URL);
	
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			callback(JSON.parse(req.responseText));
		}
	}
	req.send(null);
}

test.html
var username;
GetInfo(function(myJSONObject) {
	username = myJSONObject.username;
	alert(username) //request wurde beendet
});
alert(username); //request wurde noch nicht beendet, deswegen ist 'username' auch noch undefined.


Und was du mit "Objekt erwartet" meinst verstehe ich nicht, die Meldung habe ich bei mir nicht bekommen.
0

#8 Mitglied ist offline   FellFroscH 

  • Gruppe: aktive Mitglieder
  • Beiträge: 30
  • Beigetreten: 12. Dezember 07
  • Reputation: 0

geschrieben 11. Juni 2011 - 14:56

Erst mal vielen Dank für Eure Hilfe!
Ich glaub ich habe es nun verstanden.
Allerdings ist es mir dann nicht möglich außerhalb von GetInfo() an die Daten heran zu kommen, oder?
Wenn ich jetzt den restlichen Code in GetInfo() verschiebe, ist das gesamte Design (CSS) weg.
Ein Reload der Seite (IE8) ergibt auch kein Update der Daten...
Zur kurzen Information, das Ganze soll am Ende eine Minianwendung (Gadget) für Win7 werden.

Hier noch mal der aktuelle Stand:

js.js
var GetInfo =  function(callback) {
	var URL = "sag_ich_nicht.com";
	var req = new XMLHttpRequest();
	req.open("GET", URL);
	
	req.onreadystatechange = function() {
		if (req.readyState == 4) {
			callback(JSON.parse(req.responseText));
		}
	}
	req.send(null);
}


.html
	<script language="javascript" type="text/javascript">
		var username = null;
		var confirmed = null;
		var sendThreshold = null;
		var unconfirmed = null;
		var estimated = null;
		
		GetInfo(function(myJSONObject) {
			username = myJSONObject.username;
			confirmed = myJSONObject.confirmed_reward;
			sendThreshold = myJSONObject.send_threshold;
			unconfirmed = myJSONObject.unconfirmed_reward;
			estimated = myJSONObject.estimated_reward;
			
			document.write('<div id="gadget">');
				document.write('<div id="userinfo">');
					document.write('Username: ' + username +'<br />');
					document.write('Confirmed: ' + confirmed + '<br />');
					document.write('Send Threshold: ' + sendThreshold + '<br />');
					document.write('Unconfirmed: ' + unconfirmed + '<br />');
					document.write('Estimated: ' + estimated + '<br />');
				document.write('</div>');
			document.write('</div>');
		});
	</script>

0

#9 Mitglied ist offline   aeris 

  • Gruppe: aktive Mitglieder
  • Beiträge: 129
  • Beigetreten: 06. September 08
  • Reputation: 12
  • Geschlecht:unbekannt

geschrieben 11. Juni 2011 - 16:43

Machs doch einfach so:

<div id="gadget">
	<div id="userinfo">
		Username: <span id="sp_username">...</span><br />
		Confirmed: <span id="sp_confirmed">...</span><br />
		Send Threshold: <span id="sp_sendThreshold">...</span><br />
		Unconfirmed: <span id="sp_unconfirmed">...</span><br />
		Estimated: <span id="sp_estimated">...</span><br />
	</div>
</div>
<script language="javascript" type="text/javascript">	
	GetInfo(function(myJSONObject) {	
		document.getElementById('sp_username').innerHTML = myJSONObject.username;
		document.getElementById('sp_confirmed').innerHTML = myJSONObject.confirmed_reward;
		document.getElementById('sp_sendThreshold').innerHTML = myJSONObject.send_threshold;
		document.getElementById('sp_unconfirmed').innerHTML = myJSONObject.unconfirmed_reward;
		document.getElementById('sp_estimated').innerHTML = myJSONObject.estimated_reward;
	});
</script>


Ist ungetestet, sollte aber funktionieren.
Es werden dann einfach die Werte hineingeschrieben, wenn sie da sind.
0

#10 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 14. Juni 2011 - 10:44

Da fällt mir ein, dass man auch synchrone Abfragen schicken kann. Dafür darf allerdings onreadystatechange nicht verwendet wird, da diese einen asynchronen Request einleitet.
Eine synchrone Abfrage kann man in etwa wie folgt machen:

var req = new XMLHttpRequest();
req.open('GET', 'http://www.google.de/', false); 
req.send(null);
irgendeineFunktion(req.status, req.responseText);

0

#11 Mitglied ist offline   FellFroscH 

  • Gruppe: aktive Mitglieder
  • Beiträge: 30
  • Beigetreten: 12. Dezember 07
  • Reputation: 0

geschrieben 16. Juni 2011 - 16:01

Vielen Dank ihr beide!
Mit der Idee von Witi bin ich jetzt soweit fertig geworden.
Unter dem IE funktioniert es nun wie es soll, aber als Minianwendung passiert nichts abgesehen vom Design. So wie es aussieht wird noch nicht mal ein JavaScript-Code ausgeführt.
Im IE muss ich immer das ActiveX manuell zulassen, kann es daran liegen?
Ich bin bei google nicht schlau geworden, auch msdn geht nicht darauf ein.
Habt ihr eine Idee?
0

#12 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 16. Juni 2011 - 20:31

Welcher IE? Bei den älteren IEs muss man eine extra Krücke bauen: http://en.wikipedia.org/wiki/XMLHttpReques..._5.2C_5.5_and_6. Und ja, es läuft dort über ActiveX.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0