jQuery(跨域).getJSON,将响应存储在可重用变量中

时间:2010-10-04 18:53:03

标签: jquery ajax json ip-address cross-domain

我希望从当前用户获取 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请求,有什么方法可以实现它吗?

3 个答案:

答案 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是异步的。重构,以便在回调中执行条件。

那或使异步错误。