1

ファイル内のどこにでもアクセスできるグローバルスコープでそのdata.ipを保存したいIPアドレスを取得するための次のコードがあります。

 <script>
ip = null;
$.getJSON("http://jsonip.appspot.com?callback=?",
  function(data){
       ip = data.ip;
alert(ip); //return ip address correctly
  });
alert(ip); //undefined or null
</script>
4

6 に答える 6

5

jsonip.appspot.comはすでにダウンしています!

代わりにこのエンドポイントを使用してください

http://jsonip.com/

これは戻ります

{"ip": "222.127.106.162"、 "about": "/ about"}

于 2013-02-04T06:16:46.603 に答える
4

これにより、IP アドレスが非表示の入力フィールドに設定されます。

<script>
ip = null;
$.getJSON("http://jsonip.appspot.com?callback=?", function(data) {
    ip = data.ip;
    $("#getip").val(ip)
    alert(ip); //return ip address correctly
});
alert(ip); //undefined or null
</script>

<input id="getip" type="hidden" />
于 2012-08-10T11:16:46.330 に答える
1

これは推奨される方法ではありませんが、同期Ajax呼び出しを実行すると、問題が認識されたときに解決するはずです。

ip = null;
$.ajax({
    url: 'http://jsonip.appspot.com/',
    async: false,
    dataType: 'json',
    contentType: 'application/j-son;charset=UTF-8',
    success: function (data) {
        ip = data.ip
        alert(ip);
    }
});
alert(ip);

繰り返しになりますが、同期Ajax( Asynchronous Javascript And Xmlの略)の実行は不規則であり、Ajaxの目的をやや損なうため、これは推奨されないことを強く強調します。ただし、そのデータが返されるのをWebアプリで待機する必要がある場合は、この方法で機能するはずです。私はそれをいじくりまわしますが、URLはjsfiddleからのリクエストを許可していません。

実行を継続するための応答に依存しないようにアプリをコーディングできれば、より良いでしょう。たとえば、Ajax応答が正常に返された後に関数を呼び出した場合、次のようになります。

ip = null;
$.ajax({
    url: 'http://jsonip.appspot.com/',
    dataType: 'json',
    contentType: 'application/j-son;charset=UTF-8',
    success: function (data) {
        ip = data.ip
        alert(ip);
        gotAjaxResponse()
    }
});

function gotAjaxResponse() {
    alert(ip);
}

まだグローバル変数を使用していることに注意してくださいip(これは別の悪い習慣ですが、そのスピーチは別の日のために保存します=)、少なくとも、そのデータを持つことに依存するコードに進む前に、応答を待っています。

さらに、2番目の例ではまだジェネリック$.ajax()を使用していることに注意してください。を使用せずにasync: false、メソッドを使用できます$.getJSON()

于 2012-08-10T12:51:49.797 に答える
1

実際には、関数の外部の変数にIPアドレスが格納されます(スクリプトタグの内部にあるため、これがグローバルスコープであると思います)。

コードの問題はタイミングです。IPがip変数に格納される場所は、コードの次の部分にあります。

 function(data){
       ip = data.ip;
       alert(ip); 
  }

コードでは、この関数はコールバック関数です。$.getJSON()これは、への呼び出しが完了し、サーバーからの応答が受信されるまで実行されないことを意味します。それが発生するまで、残りのコードは実行を継続します。

これが意味するのはalert()、呼び出しのすぐ外側$.getJSON()が実行されたとき、サーバーはまだ応答しておらず、このためにコールバック関数は実行されていないということです。したがって、ip変数は設定されていません。

したがって、解決策は次のとおりです。サーバーが応答するデータを使用する前に、サーバーが応答する時間を確保できるようにコードを記述する必要があります。

詳細については、コメントのIvanKarajasが提供するこのリンクのBrandonTillysの回答を参照してください。

于 2012-08-10T12:38:25.237 に答える
0

はい@Evanに同意します。コールバックを使用するとこれを解決できます。

<script>
var ip = null;

function getIp(callback){$.getJSON("http://jsonip.appspot.com?callback=?",
  function(data){
       var tempip = data.ip;
alert(tempip); //return ip address correctly
callback(tempip);
  });}

function callback(tempip)
{
ip=tempip;
 alert(ip); //undefined or null
}

</script>
于 2012-08-10T12:03:25.897 に答える
0

グローバルスコープで「var」を使用する必要がありますか?2つの変数を作成すること

于 2012-08-10T10:57:12.923 に答える