0

我想将data.ip值存储在 ipdata 变量中。

alert( "Your ip: " + data.ip)显示正确的 IP 地址值,但alert(ipdata)显示未定义

$(document).ready(function () {

    var ipdata;

    $.getJSON("http://jsonip.appspot.com?callback=?",
        function(data){
            ipdata=data.ip;
            alert( "Your ip: " + data.ip);  
        }); 
        alert(ipdata);
    });

});
4

5 回答 5

2

它不会按预期工作,因为您ipdata=data.ip;在 ajax 调用的回调方法中进行分配。Ajax 调用本质上是异步的,这意味着一旦将请求发送到服务器,alert(ipdata);将在执行 ajax callbacl 函数之前执行。

所以你想要做的任何处理都ipdata必须在回调函数中完成

$(document).ready(function () {

    var ipdata;

    $.getJSON("http://jsonip.appspot.com?callback=?",
        function(data){
            ipdata=data.ip;
            alert( "Your ip: " + data.ip);  
            alert(ipdata);
        }); 
    });

});
于 2013-04-28T12:54:14.340 回答
1

您正在使用 AJAX A 进行异步。在 $.getJson 函数完成之前评估警报(ipdata)!要么使用 Synchronus 请求,要么学习如何使用 jquery deferend。

类似的东西(未测试)

$.getJSON("http://jsonip.appspot.com?callback=?",
    function(data){
        ipdata=data.ip;
        alert( "Your ip: " + data.ip);  
    }); 
}).done(function (){
    alert(ipdata);
});
于 2013-04-28T12:54:24.740 回答
0

$.getJSON是异步的 -

ipdata=data.ip;
alert( "Your ip: " + data.ip);

之后执行alert(ipdata); 那就是ipdata没有更新的原因

你可以看看这个问题 - https://stackoverflow.com/questions/1632039/return-value-from-ajax-call

于 2013-04-28T12:54:30.193 回答
0

getJSON 函数异步运行,因此 alert(ipdata) 在触发回调之前运行。如果您将 alert(ipdata) 移动到回调中,您会看到它打印了正确的 IP 地址。

于 2013-04-28T12:54:52.883 回答
0

正如上面 t.niese 所说,alert(ipdata) 将在 ipdata=data.ip 之前调用,因为 $.getJSON 是异步的。

您需要将依赖于 json 响应的代码放入回调中,或者您可以尝试定义一个单独的函数并在 json 回调中调用它:

$(document).ready(function () {

    var ipdata;
    var finishedJsonLoad = function() {
        alert(ipdata);
    };

    $.getJSON("http://jsonip.appspot.com?callback=?",
    function(data){
        ipdata=data.ip;
        alert( "Your ip: " + data.ip);
        finishedJsonLoad();

    });

});
于 2013-04-28T12:57:22.160 回答