1

我有以下获取 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>
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

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

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

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

在您的代码中,此函数是一个回调函数。这意味着在调用$.getJSON()完成并收到来自服务器的响应之前,它不会被执行。在此之前,您的其余代码将继续执行。

这一切意味着当alert()你的调用刚刚$.getJSON()执行时,服务器还没有响应,因此回调函数没有被执行。因此没有设置 ip 变量。

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

有关更多信息,请参阅 Ivan Karajas 在评论中提供的此链接中的Brandon Tillys 回答。

于 2012-08-10T12:38:25.237 回答
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(这是另一种不好的做法,但我将把该演讲留到另一天 =),至少在继续执行依赖于拥有该数据的代码之前,您正在等待响应。

另外,请注意,第二个示例仍然使用 generic $.ajax(),没有async: false,您可以使用该$.getJSON()方法。

于 2012-08-10T12:51:49.797 回答
0

你应该在全局范围内使用“var”吗?我认为你创建了两个变量

于 2012-08-10T10:57:12.923 回答
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 回答