Her er to sider, test.php og 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);
?>
Nå er problemet mitt: når begge disse filene er på samme server (enten localhost eller webserver), fungerer det og alert("Success")
kalles; Hvis det er på forskjellige servere, noe som betyr testserver.php på webserver og test.php på localhost, fungerer det ikke, og alert("Error")
kjøres. Selv om nettadressen i ajax er endret til http://domain.com/path/to/file/testserver.php.
Bruk 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).");";
?>
Ekkoet kan være feil, det er en stund siden jeg har brukt php. I alle fall må du sende ut callbackName('jsonString')
legg merke til anførselstegnene. jQuery vil sende sitt eget tilbakeringingsnavn, så du må hente det fra GET-parametrene.
Og som Stefan Kendall postet, $.getJSON() er en stenografisk metode, men da må du legge til 'callback=?'
til nettadressen som GET-parameter (ja, verdien er ?, jQuery erstatter dette med sin egen genererte tilbakeringingsmetode).
Du må ta en titt på Retningslinjer for samme opprinnelse:
I databehandling er samme opprinnelsespolitikk er et viktig sikkerhetskonsept for et antall programmeringsspråk på nettlesersiden programmeringsspråk, for eksempel JavaScript. Policyen policyen tillater skript som kjøres på sider som kommer fra samme nettsted for å få tilgang til hverandres metoder og egenskaper uten spesifikke restriksjoner, men forhindrer tilgang til de fleste metoder og egenskaper på tvers av sider på forskjellige nettsteder.
For at du skal kunne hente data, må den være det:
Samme protokoll og vert.
Du må implementere JSONP for å omgå dette.
Nettleserens sikkerhet forhindrer at det foretas et ajax-kall fra en side som ligger på ett domene til en side som ligger på et annet domene; dette kalles "policy for samme opprinnelse"1.