【问题标题】:Get ip address from JSON/jquery从 JSON/jquery 获取 IP 地址
【发布时间】:2012-08-10 10:45:58
【问题描述】:

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

【问题讨论】:

  • @Logard 这是你评论上方的那个东西 :rolleyes:
  • 没有标点和问号的那个?
  • 正在工作,但在您看到空值时 JSON 调用尚未完成。运行上面的代码,当你看到两个警报时,转到控制台并输入alert(ip)
  • @Logard - 抱歉,我以为您已经阅读了它并且意图声明足以理解。他在说他想做的事。因此,问题是 100% 清楚地“如何”。
  • 阅读 Brandon Tilley 对此问题的回复 (stackoverflow.com/questions/11233633/…)。它解释了为什么您尝试做的事情没有按您希望的方式工作。

标签: jquery json


【解决方案1】:

jsonip.appspot.com 已经下线了!

改用这个端点

http://jsonip.com/

这会返回

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      您的代码的问题在于时间。 ip变量中存储IP的地方就是你代码的这一部分:

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

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

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

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

      有关更多信息,请参阅由 Ivan Karajas 在 cmets 中提供的 this link Brandon Tillys 的回答。

      【讨论】:

        【解决方案4】:

        虽然不推荐这样做,但执行同步 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 和 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() 方法。

        【讨论】:

          【解决方案5】:

          也许你应该在全局范围内使用“var”?我觉得你创建了两个变量

          【讨论】:

          • 这行不通我希望我存储在 json 函数中的 ip 也可以在函数之外工作!
          【解决方案6】:

          同意@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>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-23
            • 2018-11-24
            • 1970-01-01
            • 1970-01-01
            • 2010-11-04
            相关资源
            最近更新 更多