2 Stimmen

jquery ajax post - json wird zurückgegeben, aber nicht richtig funktionieren

Ich habe das folgende Skelett für eine Ajax/Post/Aktualisierungsfunktion begonnen, die ich in Javascript (mit Jquery) schreiben möchte:

$.post("/gallery/resize",
  function (data) {
    alert(data);
    alert(data.complete);
    if (data.complete) {
      alert("done");
    } else {
      alert("blah");
    }
  },
  "json"
);

Und das Antwortskript auf dem Server lautet:

$return['complete'] = 'complete';
header('Content-type: application/json');
echo json_encode($return);
exit;

Die FireBug-Konsole zeigt, dass ich eine JSON-Zeichenfolge als Antwort erhalte - aber der Wert von data.complete ist "undefined". Hier ist die Zeichenfolge vom Server, wie von der FireBug gemeldet (ich habe auch einen entsprechenden Wert/Datenpaar unter der Registerkarte JSON unter der XHR-Anzeige in der Konsole):

{"complete":"complete"}

Irgendwelche Hinweise, was ich übersehen haben könnte...

Ich arbeite auf einem Localhost-Server - Apache auf Ubuntu - falls das einen Unterschied macht?

5voto

HorusKol Punkte 7842

Oh Junge - stellt sich heraus, dass ich ein bisschen zu viel Vertrauen in die Macht der jQuery war - ich war ein Parameter in der $.post()-Methode, die optional sein kann, wenn Sie die anderen Dinge angeben möchten fehlt.

die seltsame Sache ist, dass der Rückruf funktioniert, ohne die vorangehenden Daten-Parameter festgelegt werden - aber es flippt aus, wenn Sie den Datentyp festlegen möchten (und muss die Daten und Rückruf festgelegt haben).

Also - der richtige Code für das, was ich will, wäre:

$.post("/gallery/resize", "",
  function (data) {
    alert(data);
    alert(data.complete);
    if (data.complete) {
      alert("done");
    } else {
      alert("blah");
    }
  },
  "json"
);

2voto

alunny Punkte 898

Ich bin nicht sicher, wie jQuery JSON-Daten analysiert, aber es kann sein, dass die JSON-Zeichenfolge falsch ausgewertet wird. Wenn Sie eingeben {"complete":"complete"} in der FireBug-Konsole, wird es als Blockanweisung und nicht als Objektliteral interpretiert (die "complete" Eigenschaftsname als Bezeichnung ausgewertet wird). Dies wird durch die Auswertung von entweder ({"complete":"complete"}) o {complete:"complete"} oder mit JSON.parse sur {"complete":"complete"} . Der schnellste Weg, dies zu beheben, wäre die Entfernung der "json" Parameter aus der $.post aufrufen und die Daten selbst analysieren, etwa so:

$.post("/gallery/resize",
  function (data) {
    var obj;
    if (JSON.parse) {
      obj = JSON.parse(data);
    } else {
      obj = eval("(" + data + ")"); // obligatory eval() warning
    }
    if (data.complete) {
      alert("done");
    } else {
      alert("blah");
    }
  }
);

Übrigens, wenn Sie mit Firebug debuggen, versuchen Sie immer, die console.log anstelle von alert - Die Ausführung von JS wird nicht unterbrochen, und die JSON-Serialisierung ist viel informativer als [object Object]

1voto

Darin Dimitrov Punkte 990883

Versuchen Sie dies:

header('Content-Type: application/json');
$return = array('complete' => 'complete');
echo json_encode($return);
exit;

1voto

NutMotion Punkte 31

JSON-Daten sind wie ein Javascript-Array. Sie sollten also auf die gleiche Weise darauf zugreifen.

Daher sollten Sie in dem von Ihnen angegebenen Code den Eintrag "complete" auf diese Weise aufrufen:

data.items[0].complete

Das sollte genügen.

Hier können Sie nachsehen für weitere jQuery/JSON-Informationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X