Hae JSON GET -tietoja Javascriptillä/JQueryllä


Mitä yritän tehdä on hakea JSON-dataa verkkopalvelusta, joka etsii ja löytää tietyn merkkijonon MySQL-tietokannasta ja näyttää sen Javascriptin avulla HTML-sivulla.

Sen kanssa, jonka kanssa kamppailen, on itse asiassa tulosten tietojen näyttäminen.

HTML-sivuni asiaankuuluvat osat näyttävät tältä:

<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>

Sivu GET-datalle on http://www.foobar.com/cp/index.php hakumuuttujalla 'area'. Testiesimerkki on ?area=AB12.

Vastaus #1

Näyttää siltä, että tämä palvelu ei kääri JSON-oliota oikein sulkuihin, joten se ei toimi JSONP:nä.

Katso: http://www.entertainmentcocktail.com/cp/index.php?area=AB12&jsoncallback=TEST

Se palauttaa:

TEST[{"id":"5","name":"The Red Lion", ... ,"confirmed":"0"}]

vaikka sen pitäisi palauttaa:

TEST([{"id":"5","name":"The Red Lion", ... ,"confirmed":"0"}]);

Et voi käyttää sitä, koska se ei ole kelvollinen JSONP.

PÄIVITYS :

Vastaus kommentista saadusta lisätiedosta - jos hallitset palvelinpuolen skriptiä, yritä muuttaa:

while($row = mysql_fetch_assoc($result)) { $records[] = $row; }
echo $_GET['jsoncallback'] . json_encode($records);

kohtaan :

while($row = mysql_fetch_assoc($result)) { $records[] = $row; }
echo $_GET['jsoncallback'] . '(' . json_encode($records) . ');';

ja katso, toimiiko se.

PÄIVITYS 2:

Vastataan toiseen kommenttiin. Alatko todella alustaa output-muuttujaa? Esimerkiksi jollain tälläisellä alussa:

var output = $('#place').append('<div/>');

Kutsutko itse asiassa results-funktiotasi? Se täytyy kutsua seuraavasti:

results();

tai rekisteröity jonnekin tapahtumankäsittelijänä käyttäen jQueryn tapaa:

$('form').submit(results);

mutta lisää sitten:

return false;

results-funktion loppuun estämään sivun uudelleenlatauksen.

Katso tämä demo: http://jsbin.com/uziyek/1/edit - se näyttää toimivan.

Toinen ongelma:

Näyttää olevan toinenkin ongelma koodissasi, nimittäin että area=AB12 -parametri on kovakoodattu URL-osoitteeseesi. Sen sijaan sinun pitäisi saada arvo lomakkeelta ja lähettää se sen mukaan.

Vastaus #2

Sinä toteutit JSONP:n väärin. Sinun täytyy luoda funktiokutsu, eli vastaus pitäisi olla foo(<json tässä>);, ei foo<json tässä>.

Sen korjaaminen on helppoa:

echo $_GET['jsoncallback'] . '(' . json_encode($records) . ');';

Toinen ongelma on se, että et estä lomakkeen lähettämistä, eli kun lähetät lomakkeen, sivu päivittyy. Sinun täytyy estää se. On parempi liittää tapahtumankäsittelijä jQueryllä eikä käyttää sisäisiä tapahtumankäsittelijöitä:

<form id="myForm">

ja

$(function() {
    $('#myForm').submit(function(event) {
        event.preventDefault(); // <-- prevent form submission
        // Ajax call here
    });
});

DEMO