我希望从当前用户获取 IP ,并将其与 AJAX POST 一起发送到 PHP 文件。这意味着我需要重新使用我在IP .getJSON请求的响应中得到的变量。
脚本1:我在snipt上找到了这个方便的代码段:
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
alert( "Your ip: " + data.ip);
});
脚本1 工作,并为您的 IP 提供警告对话框。
脚本2:我将脚本1 转换为:
var ipAppspot;
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
ipAppspot = data.ip;
});
alert(ipAppspot);
据我了解,不在变量前面声明'var'关键字,即使在函数(global)之外也可以使用所有范围。虽然我认为如果脚本2 不是跨域请求可能会有效,但在这种情况下它会提供一个警告对话框'undifined' 所以这个例子不会起作用
在 Stackoverflow 上还有另一个问题jQuery-storing-ajax-response-into-global-variable来处理同样的问题。
并附上他们给出的解决方案,我得到以下内容。
脚本3:从链接中附加解决方案
// https://stackoverflow.com/questions/905298/jquery-storing-ajax-response-into-global-variable
var ipStore = (function(){
var ipAppspot;
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){ipAppspot = data.ip;});
return {getIp : function()
{
if (ipAppspot) return ipAppspot;
// else show some error that it isn't loaded yet;
}};
})();
alert(ipStore.getIp());
脚本3 提出与脚本2 相同的问题,'undefined'
问题:如何在以后的脚本中重复使用此变量?
编辑Nick Cravers回答
var ipAppspot;
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
ipAppspot = data.ip;
myFunc();
});
function myFunc() {
alert(ipAppspot);
}
来自Nick Craver ,实际上确实有效。
function dataAuth(ip){
// collect data from form
var usernameRaw = $('#feg-username').val();
var passwordRaw = $('#feg-password').val();
// phpFile is our back-endgine
var phpFile = 'feg/back-endgine.php';
// construct the JSON in a variable
var dataConstruct = "username=" + usernameRaw + "&password=" + passwordRaw + "&ip=" + ip;
// start the AJAX
$.ajax({
type: "POST",
url: phpFile,
dataType: "json",
data: dataConstruct,
success: function(msg){
alert(msg);
}
});
} // END dataAuth
这是在我的应用程序中,我将使用这样的功能:
$('body').delegate('#feg-submit', 'click', function(){
$(this).attr('disabled','disabled');
console.log('submit button clicked');
dataAuth(ipAppspot);
return false
});
所以我会在那里使用ipAppspot,稍后我需要IP for AJAX请求,有什么方法可以实现它吗?
答案 0 :(得分:3)
这不是一个范围问题,这是一个时间问题,让我们通过一个 工作的例子说明它,如下:
var ipAppspot;
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
ipAppspot = data.ip;
myFunc();
});
function myFunc() {
alert(ipAppspot);
}
You can test it here。注意它 警告你的IP,那么这里有什么不同?在填充变量之前,您不是询问变量(通过调用alert()
),这会在$.getJSON()
回调中发生。所以范围不是问题,但是回调运行以后(当响应回来时) 是一个问题,只需启动任何需要来自回调,因为这是数据第一次可用。
这是一个更常见的例子,将数据直接传递到任何地方:
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
myFunc(data.ip);
});
function myFunc(ipAppspot) {
alert(ipAppspot);
}
或者,简短版本:
$.getJSON("http://jsonip.appspot.com?callback=?", myFunc);
function myFunc(ipAppspot) {
alert(ipAppspot);
}
答案 1 :(得分:1)
您的警报在asyc操作完成之前发生,因此当时未定义。如果将警报放在回调中,您会发现它(可能)已正确定义。如果要分配和重用变量,请不要尝试在回调被触发之前执行此操作。也许需要这个值的逻辑可以放在一个从回调调用的函数中?
答案 2 :(得分:0)
Ajax是异步的。重构,以便在回调中执行条件。
那或使异步错误。