从JSON / jquery获取IP地址

时间:2012-08-10 10:45:59

标签: jquery json

我有以下代码获取IP地址我想存储具有全局范围的data.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>

6 个答案:

答案 0 :(得分:5)

jsonip.appspot.com已经关闭了!

使用此端点

http://jsonip.com/

这将返回

{ “IP”: “222.127.106.162”, “大约”: “/约”}

答案 1 :(得分: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" />

答案 2 :(得分:1)

它实际上将ip地址存储在函数外部的变量中(我假设这是你的全局范围,因为它在脚本标记内)。

代码的问题在于时机。 IP存储在ip变量中的位置在代码的这一部分:

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

在您的代码中,此函数是一个回调函数。这意味着它将不会被执行,直到$.getJSON()的调用已完成并且已收到服务器的响应。直到发生这种情况,其余代码将继续执行。

这一切意味着当执行alert()调用之外的$.getJSON()时,服务器尚未响应,因此回调函数尚未执行。因此,ip变量尚未设置。

所以解决方法就是这样:你必须编写代码,以确保服务器有时间响应,然后再尝试使用它响应的数据。

有关更多信息,请参阅Ivan Karajas在评论中提供的this link中的Brandon Tillys答案。

答案 3 :(得分: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(代表异步 Javascript和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(这是另一种不好的做法,但我会将该语音保存一天=),至少在等待响应之后再继续依赖于拥有该数据的代码。

此外,请注意第二个示例仍然使用通用$.ajax(),而不使用async: false,您可以使用$.getJSON()方法。

答案 4 :(得分:0)

Maby你应该使用&#34; var&#34;在全球范围内?我想你创建两个变量

答案 5 :(得分: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>