AJAX-request korrekt formulieren und per JSON.parse auswerten
Paeonia
- javascript
0 Sven Rautenberg0 Paeonia0 Felix Riesterer
0 paeonia
0 Felix Riesterer
0 Paeonia
Hallo zusammen,
ich habe ein Problem, ein per AJAX zurückgegebenes JSON-Objekt zu verwenden.
das script http://domain/mmpbasicfunctions.php?user=RfGB2Yy&gruppe=1&toget=flaglink gibt die Ausgabe, die ich per copy&paste zum Testen in die Variable oopsv übertrage
globale Variable MMP.flagopt wird vorher gesetzt.
console.log("vorher:");
console.log(MMP.flagopt); //Ausgabe [] -> korrekt
var oopsv = '{"cell":{"flaglink":"http:\/\/anderedomain\/users\/flag50.png","flagshadowlink":"http:\/\/anderedomain\/users\/flagsh50.png","flagoffsetx":"30","flagoffsety":"-55","flagshadowoffsetx":"0","flagshadowoffsety":"-42"}}';
function setFlagLink (){
JSON.parse(oopsv, function (key, value) {
var type;
if (value && typeof value === 'object') {
type = value.type;
if (typeof type === 'string' && typeof window[type] === 'function') {
return new (window[type])(value);
}
}
MMP.flagopt.push(value);
});
};
function setNOFlagLink() {alert("Keine Antwort!")};
var oops=setFlagLink(oopsv);
console.log("nachher:");
console.log(MMP.flagopt);
~~~// Ausgabe korrekt -> ["http://anderedomain/users/flag50.png", "http://anderedomain/users/flagsh50.png", "30", "-55", "0", "-42", Object {}, Object {}]
Wenn ich aber die Variable per AJAX anfordere, dann habe ich nachher keine Änderung des Arrays MMP.flagopt
~~~javascript
console.log("vorher:");
console.log(MMP.flagopt); //Ausgabe [] -> korrekt
var oopsv = OpenLayers.loadURL(
"http://domain/mmpbasicfunctions.php?user=RfGB2Yy&gruppe=1&toget=flaglink",
'',
this,
setFlagLink,
setNOFlagLink
);
console.log("oopsv:");
console.log(oopsv); //Ausgabe -> fXMLHttpRequest { _object=XMLHttpRequest, _lis ... responseText wie oben}
function setFlagLink (response){
JSON.parse(response, function (key, value) {
var type;
if (value && typeof value === 'object') {
type = value.type;
if (typeof type === 'string' && typeof window[type] === 'function') {
return new (window[type])(value);
}
}
MMP.flagopt.push(value);
});
};
function setNOFlagLink(oopsv) {alert("Keine Antwort!")};
//var oops=setFlagLink(oopsv);
console.log("nachher:");
console.log(MMP.flagopt);
~~~//Ausgabe [] -> FALSCH
Ich weiß nicht, welches Problem ich hier habe: CrossSiteScripting, fehlende oder falsche Variablenübergabe?
Es wäre nett, wenn mir jemand weiterhelfen könnte.
Gruß von Paeonia
Moin!
ich habe ein Problem, ein per AJAX zurückgegebenes JSON-Objekt zu verwenden.
dingeImJson = JSON.parse(jsonstring);
Wozu hast du diese Reviver-Funktion drin?
- Sven Rautenberg
Guten Morgen,
dingeImJson = JSON.parse(jsonstring);
Wozu hast du diese Reviver-Funktion drin?
Weil ich gestern fast verzweifelt bin an dieser Funktion (weil ich vermutlich in irgendeine Closure-Falle oder so etwas getappt bin. Ich konnte das für mich wichtige Array MMP.flagopt immer nur innerhalb der Funktion lesen und kam außerhalb nicht dran.) und dann den funktionierenden Code immer nur Schritt für Schritt verändert habe. Und an dem Punkt hat's gehakt.
Ich brauche den Zugriff auf MMP.flagopt an der Stelle ("nachher:")
Das Problem liegt vermutlich daran, dass ich nicht korrekt mit "this" und der Variablenübergabe umgehe. Aber mir fehlt der entscheidende Hinweis.
Danke schon mal für Deine Antwort früh am Wochenende.
Gruß von Paeonia
Lieber Sven Rautenberg,
dingeImJson = JSON.parse(jsonstring);
Wozu hast du diese Reviver-Funktion drin?
was ist eine Reviver-Funktion?
Liebe Grüße,
Felix Riesterer.
Hallo Felix,
was ist eine Reviver-Funktion?
Im Beispiel auf http://www.json.org/js.html gibt es das Beispiel "var myObject = JSON.parse(myJSONtext, reviver);" So habe ich die Frage verstanden
Gruß von Paeonia
Liebe(r) Paeonia,
Wenn ich Deinen Code lese, kann ich nicht erkennen, in welchem Zusammenhang (scope) Du oopsv definierst, und auf was das Schlüsselwort "this" deswegen verweist:
console.log("vorher:");
console.log(MMP.flagopt); //Ausgabe [] -> korrekt
var oopsv = OpenLayers.loadURL(
"http://domain/mmpbasicfunctions.php?user=RfGB2Yy&gruppe=1&toget=flaglink",
'',
this,
setFlagLink,
setNOFlagLink
);
Wird dieser gesamte Code-Ausschnitt innerhalb einer Funktion benutzt (z.B. "mach\_mal()"), deutet "this" auf das Objekt, welches diese Funktion ("mach\_mal()", nicht "OpenLayers.loadURL()"!) als Methode besitzt. Gibt es kein "übergeordnetes" Objekt, bezieht sich "this" auf "window". Stellt sich nun die Frage: Auf was sollte sich "this" denn beziehen und könnte dieses Detail mit Deinem Problem zusammenhängen?
Liebe Grüße,
Felix Riesterer.
--
ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
Hallo Felix,
Wenn ich Deinen Code lese, kann ich nicht erkennen, in welchem Zusammenhang (scope) Du oopsv definierst, und auf was das Schlüsselwort "this" deswegen verweist:
<?php echo '<?xml version="1.0" ?'.'>' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
...
<script type="text/javascript">
var map = null;
function init(){
...
hier kommt der gepostete Code
this is window, soweit ich das verstehe
hier gehts weiter mit variablen, die ich per AJAX erhalten möchte
</script>
</head>
<body onload="init();">
<div id="map" class="smallmap">
<!-- dahinein wird das map-object geschrieben (OpenLayers-Bibliothek)
aber das ist keine OpenLayersProblem, sondern pures Javascript, was mir da fehlt -->
</div>
...
</body>
</html>
Wird dieser gesamte Code-Ausschnitt innerhalb einer Funktion benutzt
(z.B. "mach_mal()") ist vermutlich function init() -> this = window?
könnte dieses Detail mit Deinem Problem zusammenhängen?
bestimmt tut es das, aber ich komme nicht auf die Lösung, denn einfach MMP.flagopt statt this in die Funktion OpenLayers.loadURL zu schreiben tut es nicht. Was ist das Ziel für die Funktion. Ich dachte, wenn ich eine Variable über den Funktionsaufruf erzeuge, dann wird die Rückgabe dahinein geschrieben. Aber this ist im Weg
Grüße von Paeonia (nicht Paeonio)