jquery jsonp in for语句得到了意想不到的结果

时间:2014-08-02 12:38:38

标签: javascript jquery for-loop jsonp

我正在使用jquery做一些jsonp-callbak,以便将HTML中的IP转换为几何信息。这是HTML示例的一部分:

<span id="1" name="ip">211.139.114.235</span>
<span id="2" name="ip">211.139.114.235</span>
<span id="3" name="ip">211.139.114.235</span>
......
<span id="12" name="ip">223.66.235.21</span>
<span id="13" name="ip">223.66.235.21</span>
<span id="14" name="ip">223.66.235.21</span>

你看到许多IP是相同的,所以我首先将它们放在{}中,并且只为一个IP做一次jsonp回调。所以这是我的javascript代码,但是我得到了一个非常奇怪的结果:

<script type="text/javascript">
        ipList = {};
        $(function(){
            $('span[name="ip"]').each(function(index,DOM){
                ip = $(DOM).html();
                if (ipList[ip]==undefined){
                    ipList[ip]={DOMList:[],data:{}};
                }
                ipList[ip].DOMList.push(DOM);
            });

            console.log('Log 1=======',ipList);

            for ( ip in ipList){
                console.log('Log 2=======',ip);

                $.get("http://ipinfo.io/"+ip+'/geo', function(response) {
                    console.log('Log 3=======',ip,response);

                    ipList[ip].data=response;
                    var domList = ipList[ip].DOMList;
                    for( i in domList ){
                        $(domList[i]).html(response.region+' '+response.city);
                    }
                }, "jsonp");
            }
        });
    </script>

三个console.log在Chrome(版本24.0)控制台中显示以下结果(我对结果做了一些漂亮的打印工作):

Log 1======= Object{
    211.139.114.235: Object{
        DOMList: Array[11]
        data: Object{}
        }
    223.66.235.21: Object{
        DOMList: Array[3]
        data: Object{}
        }
    }

Log 2======= 211.139.114.235
Log 2======= 223.66.235.21

Log 3======= 223.66.235.21 Object {ip: "211.139.114.235", city: "Haimen", region: "Jiangsu", country: "CN", loc: "31.8962,121.1727"}
Log 3======= 223.66.235.21 Object {ip: "223.66.235.21", city: null, region: null, country: "CN", loc: "35.0000,105.0000"}

Log 3给出的最后结果非常奇怪,因为ip变量是相同的!---它们都是223.66.235.21而变量ip位于$.get("http://ipinfo.io/"+ip+'/geo'... 1}}不同,(您也可以通过Log 2中的结果和response中与ip一起提供的Log 3变量来确认这一点

ip变量&#39;结果Log 3Log 2相同,不是吗?

上述问题导致回调函数中的代码仅将最后一个ip(223.66.235.21)转换为最后response的数据。 我无法弄清问题在哪里。

感谢任何帮助,提前谢谢〜

====================解决====================

感谢mottie的回答。

虽然jquery jsonp回调函数可以通过闭包访问变量ip,因为jsonp是异步的,所以这些函数在jsonp结果返回后调用。但是,此时for循环已完成,变量ip设置为ipList中的最后一个(Javascript具有范围for 1}}语句,因此ip位于$(function(){...的范围内。)。这就是为什么两个回调函数都将ip作为最后一个(223.66.235.21)。它们只是引用相同的ip

0 个答案:

没有答案