Načítanie JSON dát cez GET pomocou Javascript/JQuery
Čo sa snažím urobiť je načítať JSON údaje z online webovej služby, ktorá vyhľadáva a nájde určitý reťazec v databáze MySQL a zobraziť ich pomocou Javascriptu na HTML stránke.
S čím zápasím, je skutočne zobrazenie výsledných údajov.
Príslušné oblasti mojej HTML stránky vyzerajú takto:
<form onSubmit="results()">
<fieldset>
<label for="area">First digits of postal code:</label>
<input name="area" type="text" maxlength="4" placeholder="AB12" required />
<input type="submit" value="Search" name="search" />
</fieldset>
</form>
<script type="text/javascript" src="jquery/jquery.min.js"></script>
<script type="text/javascript" src="cordova-2.3.0.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<script type="text/javascript">
function results(){
$.ajax({
url: 'http://www.foobar.com/cp/index.php?area=AB12',
dataType: 'jsonp',
jsonp: 'jsoncallback',
timeout: 5000,
success: function(data, status){
$.each(data, function(i,item){
var place = '<h1>'+item.location+'</h1>'
+ '<p>'+item.id+'</br>';
output.append(place);
});
},
error: function(){
output.text('There was an error loading the data.');
}
});
};
</script>
<div id="place">
<h3>Places near your location</h3>
</div>
Stránka pre GET dáta je http://www.foobar.com/cp/index.php s vyhľadávacou premennou 'area'. Testovací vzor je ?area=AB12.
Odpoveď č. 1
Zdá sa, že táto služba správne nezakrýva JSON objekt do zátvoriek, takže nefunguje ako JSONP.
Pozri: http://www.entertainmentcocktail.com/cp/index.php?area=AB12&jsoncallback=TEST
Vracia:
TEST[{"id":"5","name":"The Red Lion", ... ,"confirmed":"0"}]
zatiaľ čo by to malo vrátiť:
TEST([{"id":"5","name":"The Red Lion", ... ,"confirmed":"0"}]);
Nebudete ho môcť použiť, pretože nie je platný JSONP.
AKTUALIZÁCIA :
Odpoveď na viac informácií z komentára - ak ovládate skript na strane servera, skúste zmeniť:
while($row = mysql_fetch_assoc($result)) { $records[] = $row; }
echo $_GET['jsoncallback'] . json_encode($records);
do :
while($row = mysql_fetch_assoc($result)) { $records[] = $row; }
echo $_GET['jsoncallback'] . '(' . json_encode($records) . ');';
a uvidíme, či to funguje.
AKTUALIZÁCIA 2:
Odpovedám na iný komentár. Skutočne inicializujete premennú output? Napríklad niečím takýmto na začiatku:
var output = $('#place').append('<div/>');
Skutočne voláte svoju funkciu results? Musí sa zavolať s:
results();
alebo zaregistrované niekde ako obslužná rutina udalostí, pomocou jQuery spôsobu:
$('form').submit(results);
ale potom pridajte:
return false;
na koniec funkcie results, aby sa zabránilo znovunačítaniu stránky.
Pozrite si túto ukážku: http://jsbin.com/uziyek/1/edit - zdá sa, že funguje.
Ďalší problém:
Zdá sa, že vo vašom kóde je ďalší problém, a to, že parameter area=AB12 je pevne zakódovaný vo vašej URL. Namiesto toho by ste mali získať hodnotu z formulára a odoslať ju.
Odpoveď č. 2
JSONP ste implementovali nesprávne. Musíte vygenerovať volanie funkcie, t.j. odpoveď by mala byť foo(<json tu>);, nie foo<json tu>.
Je to banálne opraviť:
echo $_GET['jsoncallback'] . '(' . json_encode($records) . ');';
Ďalším problémom je, že nebránite odoslaniu formulára, t. j. keď odošlete formulár, stránka sa obnoví. Musíte tomu zabrániť. Lepšie je viazať obsluhu udalosti pomocou jQuery a nepoužívať inline obsluhu udalostí:
<form id="myForm">
a
$(function() {
$('#myForm').submit(function(event) {
event.preventDefault(); // <-- prevent form submission
// Ajax call here
});
});
DEMO
