繁体   English   中英

从JSON / jquery获取IP地址

[英]Get ip address from JSON/jquery

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

jsonip.appspot.com已经关闭!

改用这个端点

http://jsonip.com/

这会回来

{“ ip”:“ 222.127.106.162”,“ about”:“ / about”}

这会将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" />

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

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

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

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

这一切都意味着,当alert()外面的$.getJSON()被调用执行,该服务器尚未responed也正因为如此,回调函数没有被执行。 因此,尚未设置ip变量。

因此解决方案是这样的:您必须以某种方式编写代码,以确保在尝试使用服务器响应的数据之前,服务器有时间进行响应。

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

虽然这不是推荐的处理方式,但是执行同步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()方法。

Maby您应该在全局范围内使用“ var”吗? 我要创建两个变量

是的,同意@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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM