Qui ci sono due pagine, test.php e 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>
**Il server di prova.php.
<?php
$arr = array("element1",
"element2",
array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>
Ora il mio problema: quando entrambi questi file sono sullo stesso server (sia localhost che web server), funziona e viene chiamato alert("Success")
; Se sono su server diversi, cioè testserver.php sul web server e test.php su localhost, non funziona, e viene eseguito alert("Error")
. Anche se l'URL all'interno di ajax è cambiato in http://domain.com/path/to/file/testserver.php
Utilizzare 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).");";
?>
L'echo potrebbe essere sbagliato, è passato un po' da quando ho usato php. In ogni caso hai bisogno di emettere callbackName('jsonString')
notando le virgolette. jQuery passerà il proprio nome di callback, quindi hai bisogno di prenderlo dai parametri GET.
E come ha postato Stefan Kendall, $.getJSON() è un metodo shorthand, ma poi devi aggiungere 'callback=?'
all'url come parametro GET (sì, il valore è ?, jQuery lo sostituisce con il proprio metodo di callback generato).
Devi dare un'occhiata a Same Origin Policy:
In informatica, la stessa politica di origine è un importante concetto di sicurezza per un numero di linguaggi di programmazione lato browser
linguaggi, come JavaScript. La politica permette l'esecuzione di script su pagine provenienti dallo stesso sito di accedere l'un l'altro a metodi e proprietà senza specifiche restrizioni, ma impedisce l'accesso a la maggior parte dei metodi e delle proprietà tra pagine di siti diversi.
Per essere in grado di ottenere i dati, deve essere:
stesso protocollo e stesso host
È necessario implementare JSONP per aggirare il problema.
La sicurezza del browser impedisce di fare una chiamata ajax da una pagina ospitata su un dominio a una pagina ospitata su un dominio diverso; questo è chiamato "same-origin policy".