我正在使用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 3
与Log 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
!