Hier sind zwei Seiten, test.php und testserver.php.
test.php
<script src="scripts/jq.js" type="text/javascript"></script>
<script>
$(function() {
$.ajax({url:"testserver.php",
success:function() {
alert("Success");
},
error:function() {
alert("Error");
},
dataType:"json",
type:"get"
}
)})
</script>
testserver.php
<?php
$arr = array("element1",
"element2",
array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>
Jetzt mein Problem: wenn beide Dateien auf dem gleichen Server sind (entweder localhost oder Webserver), funktioniert es und alert("Success")
wird aufgerufen; Wenn es auf verschiedenen Servern ist, d.h. testserver.php auf Webserver und test.php auf localhost, funktioniert es nicht, und alert("Error")
wird ausgeführt. Auch wenn die URL in ajax auf http://domain.com/path/to/file/testserver.php geändert wird.
Verwenden Sie JSONP.
jQuery:
$.ajax({
url:"testserver.php",
dataType: 'jsonp', // Notice! JSONP <-- P (lowercase)
success:function(json){
// do stuff with json (in this case an array)
alert("Success");
},
error:function(){
alert("Error");
}
});
PHP:
<?php
$arr = array("element1","element2",array("element31","element32"));
$arr['name'] = "response";
echo $_GET['callback']."(".json_encode($arr).");";
?>
Das echo könnte falsch sein, es ist eine Weile her, seit ich php benutzt habe. Auf jeden Fall müssen Sie callbackName('jsonString')
ausgeben, beachten Sie die Anführungszeichen. jQuery übergibt seinen eigenen Callback-Namen, also müssen Sie diesen aus den GET-Params holen.
Und wie Stefan Kendall gepostet, $.getJSON() ist eine Shorthand-Methode, aber dann müssen Sie 'callback=?'
an die url als GET-Parameter anhängen (ja, Wert ist ?, jQuery ersetzt dies durch seine eigene generierte Callback-Methode).
Sie müssen einen Blick auf Same Origin Policy werfen:
In der Datenverarbeitung ist die Richtlinie für den gleichen Ursprung
ist ein wichtiges Sicherheitskonzept für eine Anzahl von Browser-seitigen Programmier Sprachen, wie z.B. JavaScript. Die Richtlinie erlaubt Skripte, die auf Seiten, die von der gleichen Website stammen auf die Methoden und Eigenschaften der jeweils anderen Eigenschaften ohne spezifische Einschränkungen, verhindert aber den Zugriff auf die meisten Methoden und Eigenschaften über Seiten an verschiedenen Standorten.
Damit Sie Daten abrufen können, müssen diese vorhanden sein:
Gleiches Protokoll und gleicher Host
Sie müssen JSONP implementieren, um dieses Problem zu umgehen.
Die Browsersicherheit verhindert, dass ein Ajax-Aufruf von einer Seite, die auf einer Domäne gehostet wird, zu einer Seite erfolgt, die auf einer anderen Domäne gehostet wird; dies wird als "same-origin policy" bezeichnet.