[英]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已经关闭!
改用这个端点
这会回来
{“ 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.