我有以下代码获取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>
答案 0 :(得分:5)
答案 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>