2009-07-21 3 views
2

Je suis un noob chez json (sais un peu de jquery) .... et en essayant d'obtenir un petit script pour travailler Je veux récupérer l'heure à un certain lat/lng et composé ce script en bits de ce que j'ai lu en ligne:Le rappel JSONP échoue, besoin d'aide avec javascript/jquery

$.getJSON("http://ws.geonames.org/timezoneJSON?lat=47.01&lng=10.2&callback=?", 

    { 'uID': 1 }, 

    function(data) { 
     $.each(data, function(i, item) { 
      $("<span/>").html(item.time).html(".nowtime"); 
     }); 
    }); 

Inutile de dire que cela ne fonctionne pas ... quelqu'un pourrait me donner un coup de main avec elle et aussi expliquer $ (""). Html (item.time) .html (". Nowtime"); signifie. (Je ne comprends pas ce que le premier est)

Voici la référence source JSON: http://www.geonames.org/export/web-services.html#timezone

grâce

+0

fire up firebug. où échoue-t-il? envoyer la demande? ou dans le rappel? – geowa4

+0

nvm je l'ai couru. il échoue dans le rappel. firebug aint à bien déboguer, mais au moins je peux être raisonnablement assuré que ce n'est pas XSS. – geowa4

Répondre

3

je pensais à l'origine du problème est le plus probable dans la politique de même origine . Pour faire une requête AJAX à une URL, elle doit être dans le même domaine (et port) que la page contenant le code Javascript. Mais après la correction de George IV, je l'ai vérifié.

L'objet data renvoyé dans le rappel est l'objet JSON-evaled, et il ne s'agit pas d'un tableau. Très probablement, votre code devrait avoir lu quelque chose comme:

$.getJSON("http://ws.geonames.org/timezoneJSON?lat=47.01&lng=10.2&callback=?", 
    { 'uID': 1 }, 
    function(data) { 
    $("<span/>").html(data.time); // Or maybe with a different selector (see below) 
    } 
); 

Le sélecteur est probablement faux, vous voudrez peut-être, par exemple, de mettre le résultat dans un div avec un id de test. La ligne contenant le sélecteur dans ce cas doit être remplacé par:

$("#test").html(data.time); 

Ce que cela dit est, obtenir l'objet avec id test (le signe dièse (#) indique qu'il est une idée), et mettre à jour le contenu avec data.time est réglé sur.

+0

non. lancez-le vous-même dans firebug. il casse dans le rappel. – geowa4

+0

Vous avez raison, je ne peux pas me croire les yeux! Réponse fixe, cependant. –

+0

il vaut mieux être ok, c'est ce que stackoverflow utilise pour son flair. – geowa4

1

Le code d'intervalle crée un élément span, puis définit son code HTML sur la valeur temporelle renvoyée. Le code semble faux, car il définit immédiatement le HTML à ".nowtime" mais ne l'ajoute jamais réellement au DOM. Je devine que le dernier .html ('. Nowtime') devrait vraiment être .addClass ('. Nowtime') et il devrait y avoir un .appendTo (???) quelque part, mais je ne suis pas sûr d'où vous devrait être l'ajouter.

EDIT:

Aussi, je ne pense pas que vous avez besoin de chaque fonction. Il semble être itérer sur les membres de l'objet de données. Vous voulez juste l'utiliser directement la propriété de temps.

Exemple (bien que, vous voulez probablement il ajouté au DOM ailleurs):

$(function() { 
    $.getJSON("http://ws.geonames.org/timezoneJSON?lat=47.01&lng=10.2&callback=?", { 'uID': 1 }, function(data) { 
     $("<span/>").html(data.time).appendTo('body'); 
    }); 
}); 

Note: si votre appel JSONP devait retourner un tableau d'objets alors vous devez itérer les avec chaque méthode. Je ne connais pas assez le service pour savoir s'il existe des méthodes qui retourneraient un tableau d'objets. Cet appel ne fait pas, cependant.

+0

Nous avons un gagnant! Je l'ai juste couru dans firebug et le problème est en utilisant le 'each'. 'i' est la clé et' item' est la valeur dans son cas. – geowa4

0

Vous n'êtes pas très clair sur ce qui ne va pas. Le rappel semble essayer d'obtenir le champ nowtime et le mettre dans un contrôle sur la page.Je pense que:

$("").html 

Devrait avoir un sélecteur dans les guillemets pour dire où le résultat va. Quelque chose comme $ ("# myfield") ....

+0

Il n'y a pas de propriété "nowtime". Je devine que c'est une classe qui devrait être appliquée, mais il n'y a pas assez de code (balisage) à dire. – tvanfosson

Questions connexes