请给我一个简单的提示,在哪里挖!
我有多个IP,并且需要在每个IP旁边显示位置。
我有一个通过阵列的IPS列表
var table = document.createElement('table');
table.innerHTML = forext;
var ips = [].slice.call(table.querySelectorAll('a[href*="?ip="]')).map(anchor => anchor.textContent).join("\n");
8.8.8.8
8.8.4.4
...
我可以通过输入框获取每个位置
$('.send').on('click', function(){
$.getJSON('https://ipapi.co/'+$('.ip').val()+'/json', function(data){
$('.city').text(data.city);
$('.country').text(data.country);
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="ip" value="8.8.8.8">
<button class="send">Go</button>
<br><br>
<span class="city"></span>,
<span class="country"></span>
但是我需要打印IP及其旁边的位置:
所以,我有这个:
8.8.8.8
8.8.8.8
但是我需要这个
8.8.8.8 -Mountain View, US
8.8.8.8 -Mountain View, US
...
如何通过http://freegeoip.net/json/处理整个数组?谢谢。
更新1:尝试使用ips [i]
var ipText='Lookup...';
var table = document.createElement('table');
table.innerHTML = forext;
var ips = [].slice.call(table.querySelectorAll('a[href*="?ip="]')).map(anchor => anchor.textContent).join("\n");
var ipLocations = [];
for(i=0;i<ips.length;i++){
$.getJSON('https:/freegeoip.net/json/' + ips[i], function(data) {
// could also use data.country_name, or any other property in the returned JSON
var outputString = data.ips[i] + ' - ' + data.city + ', ' + data.country_code;
ipLocations.push(outputString);
});
}
ipText = ipLocations.join('\n');
message.innerText = ipText;
最佳答案
首先,您确实希望IP是字符串数组,而不是单个字符串。这样,您应该更改var ips = ...
的声明,并从最后删除.join("\n")
-这会将您方便的IP字符串列表变成单个字符串,并且IP不需要换行符。
然后,当您拥有IP数组形式的ips = ['8.8.8.8', '8.8.4.4', ... ];
...然后您可以通过以下方式获得描述的输出:
var ipLocations = [];
for (var ip of ips) {
$.getJSON('https://freegeoip.net/json/' + ip, function(data) {
// could also use data.country_name, or any other property in the returned JSON
var outputString = data.ip + ' - ' + data.city + ', ' + data.country_code;
ipLocations.push(outputString);
});
}
如您所描述的,您现在有了一个具有IP地址+位置的字符串数组。如果现在要将THAT变成单个字符串,则可以执行
ipText = ipLocations.join('\n');
以获得用换行符分隔的输出行。但是,如果要将文本输出到HTML文档中,则可能需要加入
<br>
而不是\n
,在许多上下文中,诸如\n
之类的空白字符将被忽略,并且您将结束将所有输出都放在一行上。更新:
我的原始答案中有一些非常愚蠢的错误,其中最主要的是我混合使用Python和JavaScript语法(facepalm)。修复它们后,此代码即可正常工作。话虽这么说,但有一些需要注意的警告,以及您应该真正理解的Update 1代码中的一些错误。
首先,您的代码中的问题:
在定义
.join("\n")
的第4行中,您从未摆脱过ips
,因此它仍然只是一个字符串,而不是字符串数组。这意味着您的for循环实际上是遍历ips
字符串中的每个单个字符,而不是完整的IP地址。您尝试在循环内访问
data.ips[i]
。 data
变量包含对AJAX请求的JSON响应,但是jQuery自动将其从JSON字符串转换为实际的JavaScript对象。它仅具有响应中包含的属性。在这种情况下,响应始终具有ip
属性,因此您可以访问data.ip
。但是,ips
是您创建的变量-data.ips
不存在,因此无法访问其索引。附带说明一下,如果您使用
for...of
语法,则还可以使用一个名为ip
的循环变量来代替。但是,您需要了解ip
和data.ip
不是相同的变量,即使在这种情况下它们始终具有相同的值。URL以“ https:/”开头,而不是“ https://”。这实际上是我的错,我在最初的答案中输入了错字> _>;
顺便说一句,您在注释中提出了非常重要的一点-函数
$.getJSON()
是异步的,因此(忽略其他问题)在Update 1中编写的代码可能无法达到预期的效果。即使您的AJAX请求尚未响应,调用getJSON
之后的代码也将继续运行,因此,如果您立即访问ipLocs
数组,则它可能仅包含一些输出字符串,甚至为空。 。我不会向您解释如何等待非阻塞代码,因为这是一个完全不同的问题。考虑到您对JavaScript的熟悉程度,我还担心这只会使事情更加混乱。但是,如果您只是想要一个快速的解决方案,即使它根本不是最佳实践,它也可以提供期望的结果,则可以使用
ajax
函数而不是getJSON
。这使您可以明确地告诉jQuery同步发送AJAX请求,这意味着它将在继续运行代码之前等待响应。但是,您需要注意,同步请求可能会暂时锁定您的浏览器,从而阻止任何其他操作,直到请求完成为止。该版本如下所示:var ipLocations = [];
for (var ip of ips) {
$.ajax({
url: 'https://freegeoip.net/json/' + ip,
async: false,
success: function(data) {
var outputString = data.ip + ' - ' + data.city + ', ' + data.country_code;
ipLocations.push(outputString);
}
});
}
关于javascript - 使用freegeoip获取IP列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45495576/