Javascript 使用 jQuery/JS(没有 google geolocation api)查找用户位置?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14177647/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 15:56:16  来源:igfitidea点击:

Find user location using jQuery/JS (without google geolocation api)?

javascriptjqueryunobtrusive-javascript

提问by user1530249

Is there a way to find a clients location on a website using just jQuery. For example, if a user comes to my site, how could I find out what their approximate location is just using jQuery. For example, if a user came from San Francisco CA it would have some type identifier to let me know the user came from San Francisco CA. I wouldn't really need their exact location just the county or general area of origin.

有没有办法仅使用 jQuery 在网站上查找客户端位置。例如,如果用户访问我的站点,我如何仅使用 jQuery 找出他们的大致位置。例如,如果用户来自加利福尼亚州旧金山,它将有一些类型标识符让我知道用户来自加利福尼亚州旧金山。我真的不需要他们的确切位置,只是县或一般原产地。

edit: How is the information on http://flourishworks-webutils.appspot.com/reqgenerated?

编辑:http://flourishworks-webutils.appspot.com/req 上的信息是如何生成的?

Thanks

谢谢

回答by Durgesh Pandey

To get the client IP address & country name in jQuery:

要在 jQuery 中获取客户端 IP 地址和国家/地区名称:

$.getJSON("http://freegeoip.net/json/", function(data) {
    var country_code = data.country_code;
    var country = data.country_name;
    var ip = data.ip;
    var time_zone = data.time_zone;
    var latitude = data.latitude;
    var longitude = data.longitude;

    alert("Country Code: " + country_code);
    alert("Country Name: " + country);
    alert("IP: " + ip); 
    alert("Time Zone: " + time_zone);
    alert("Latitude: " + latitude);
    alert("Longitude: " + longitude);   
});

$.get("http://freegeoip.net/json/", function (response) {
    $("#ip").html("IP: " + response.ip);
    $("#address").html("Location: " + response.city + ", " + response.region_name);
    $("#details").html(JSON.stringify(response, null, 4));
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<h3>Client side IP geolocation using <a href="http://freegeoip.net">freegeoip.net</a></h3>

<hr/>
<div id="ip"></div>
<div id="address"></div>
<hr/>Full response: <pre id="details"></pre>

回答by Ben Dowling

You can use a web service that supports JSONP, such as my service http://ipinfo.io. It'll provide you with the client's IP address, hostname, geolocation information and network owner. Here's an example of it in action with jQuery:

您可以使用支持 JSONP 的 Web 服务,例如我的服务http://ipinfo.io。它将为您提供客户端的 IP 地址、主机名、地理位置信息和网络所有者。这是它与 jQuery 一起使用的示例:

$.get("http://ipinfo.io", function(response) {
    $("#ip").html(response.ip);
    $("#address").html(response.city + ", " + response.region);
}, "jsonp");

Here's a more detailed JSFiddle example that also prints out the full response information, so you can see all of the available details: http://jsfiddle.net/zK5FN/2/

这是一个更详细的 JSFiddle 示例,它也打印出完整的响应信息,因此您可以查看所有可用的详细信息:http: //jsfiddle.net/zK5FN/2/

回答by Julien

The HTML5 Geolocation APIallows you to get a user's Latitude/Longitude with some JavaScript (if the browser is compatible, and if the user allows access to his/her location).

HTML5地理位置API可以让你获得一些JavaScript的用户的纬度/经度(如果浏览器兼容,如果用户允许他/她的位置访问)。

You can then reverse-geocodethe location to get an address, there are several free reverse-geocodingservices other than Google's API.

然后您可以对位置进行反向地理编码以获取地址,除了 Google 的 API 之外,还有几种免费的反向地理编码服务。

However, if you don't need accurate location, and if you want all your users to take advantage of the feature (no matter the browser), and if you don't want to ask them whether they allow your site to have their location, I would recommend to use your user's IP to get the location.

但是,如果您不需要准确的位置,并且如果您希望所有用户都利用该功能(无论使用哪种浏览器),并且如果您不想询问他们是否允许您的站点获得他们的位置,我建议使用您用户的 IP 来获取位置

回答by Jonathan

I created the ipdata.coAPI to provide a solid solution to this, see the below fiddle to play with. It returns numerous useful datapoints, such as - location: country (name and code), region, city etc., ecommerce - currency_code, currency symbol, timezone, mobile carrier data and it detects whether the IP address is a Proxy or a Tor user.

我创建了ipdata.coAPI 来为此提供可靠的解决方案,请参阅下面的小提琴。它返回许多有用的数据点,例如 - 位置:国家(名称和代码)、地区、城市等,电子商务 - 货币代码、货币符号、时区、移动运营商数据,并检测 IP 地址是代理还是 Tor 用户.

Ipdata has 10 global endpoints each able to handle >10,000 requests per second.

Ipdata 有 10 个全局端点,每个端点每秒可以处理超过 10,000 个请求。

This answer uses a 'test' API Key that is very limited and only meant for testing a few calls. Signupfor your own Free API Key and get up to 1500 requests daily for development.

这个答案使用了一个非常有限的“测试”API 密钥,仅用于测试几个调用。注册您自己的免费 API 密钥,每天最多可收到 1500 个开发请求。

$.get("https://api.ipdata.co?api-key=test", function (response) {
    $("#ip").html("IP: " + response.ip);
    $("#city").html(response.city + ", " + response.region);
    $("#response").html(JSON.stringify(response, null, 4));
}, "jsonp");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1><a href="https://ipdata.co">ipdata.co</a> - IP geolocation API</h1>

<div id="ip"></div>
<div id="city"></div>
<pre id="response"></pre>

See the fiddle at https://jsfiddle.net/ipdata/6wtf0q4g/922/

请参阅https://jsfiddle.net/ipdata/6wtf0q4g/922/ 上的小提琴

回答by Ashutosh Tiwari

**jQuery(document).ready(function($) {
    jQuery.getScript('http://www.geoplugin.net/javascript.gp', function()
{
    var country = geoplugin_countryName();
    var zone = geoplugin_region();
    var district = geoplugin_city();
    console.log("Your location is: " + country + ", " + zone + ", " + district);
});
});
<script language="JavaScript" src="http://www.geoplugin.net/javascript.gp" type="text/javascript"></script>
<script type="text/javascript">
jQuery(document).ready(function($) {
    alert("Your location is: " + geoplugin_countryName() + ", " + geoplugin_region() + ", " + geoplugin_city());
});
</script>
/*--------------------------------detailed function list not necessarily to be included---------
function geoplugin_city() { return 'Dobroyd Point';}
function geoplugin_region() { return 'New South Wales';}
function geoplugin_regionCode() { return '02';}
function geoplugin_regionName() { return 'New South Wales';}
function geoplugin_areaCode() { return '0';}
function geoplugin_dmaCode() { return '0';}
function geoplugin_countryCode() { return 'AU';}
function geoplugin_countryName() { return 'Australia';}
function geoplugin_continentCode() { return 'OC';}
function geoplugin_latitude() { return '-33.873600';}
function geoplugin_longitude() { return '151.144699';}
function geoplugin_currencyCode() { return 'AUD';}
function geoplugin_currencySymbol() { return '&amp;#36;';}
function geoplugin_currencyConverter(amt, symbol) {
    if (!amt) { return false; }
    var converted = amt * 0.9587170632;
    if (converted &lt;0) { return false; }
    if (symbol === false) { return Math.round(converted * 100)/100; }
    else { return '&amp;#36;'+(Math.round(converted * 100)/100);}
    return false;
} 
*/
//----------------example-----------------------//
<html>
 <head>
  <script language="JavaScript" src="http://www.geoplugin.net/javascript.gp" type="text/javascript"></script>
 </head>
 <body>
  <script language="Javascript">
    document.write("Welcome to our visitors from "+geoplugin_city()+", "+geoplugin_countryName());
  </script>
 </body>
</html>

回答by Lucian

Any client side option is not a good idea, because they are provided by the computer based on the wireless networks around. I bet that 90% of desktop users don't have this feature activated. When you get to a website that want your location, you have to click a button to agree to. If they just got on your website, then they want to know first why you need their location.

任何客户端选项都不是一个好主意,因为它们是由基于周围无线网络的计算机提供的。我敢打赌 90% 的桌面用户没有激活此功能。当您访问需要您的位置的网站时,您必须单击一个按钮以同意。如果他们刚刚访问您的网站,那么他们首先想知道您为什么需要他们的位置。

A good way is to show them a page to inform them why you need their location and that you will never use it for any other purposes than the specified one, and the location will not be saved in your database.

一个好方法是向他们展示一个页面,告知他们您为什么需要他们的位置,并且除了指定的目的外,您绝不会将其用于任何其他目的,并且该位置不会保存在您的数据库中。

If there is a script that runs server side, then there is a connection from the client to the server. In this case the Server must know the IP Address. There is a trick that you can do to get the IP Address first.

如果有运行服务器端的脚本,那么就有从客户端到服务器的连接。在这种情况下,服务器必须知道 IP 地址。有一个技巧可以让您先获取 IP 地址。

Make a php script on your server, that will return only the IP Address. Since the jquery is processed locally, when a connection is made to the server, the client IP Address will be disclosed. It will take some additional time to make the required connections but soon the IP Address will be available in jQuery.

在您的服务器上制作一个 php 脚本,它只会返回 IP 地址。由于jquery是在本地处理的,当连接到服务器时,客户端IP地址会被泄露。建立所需的连接需要一些额外的时间,但很快就会在 jQuery 中提供 IP 地址。

Then, you can call trough jquery an external API that will give you information for that specific IP Address. Either you buy an IP Database and install it on your websserver so you can call it, either you use another API. You can check http://www.ipgp.net/ip-address-geolocation-api/

然后,您可以通过 jquery 调用外部 API,该 API 将为您提供该特定 IP 地址的信息。要么您购买 IP 数据库并将其安装在您的网络服务器上,以便您可以调用它,要么您使用另一个 API。您可以查看http://www.ipgp.net/ip-address-geolocation-api/

回答by Andrey E

This is possible with https://ip-api.iogeo location API. It provides country, city, zip code, coordinates, network, ASN, timezone. For example with jQuery:

这可以通过https://ip-api.io地理位置 API 实现。它提供国家、城市、邮政编码、坐标、网络、ASN、时区。例如使用 jQuery:

$(document).ready( function() {
    $.getJSON("http://ip-api.io/api/json",
        function(data){
            console.log(data);
        }
    );
});

Also https://ip-api.iochecks TOR, public proxy and spammer databases and provides this information as well.

https://ip-api.io还会检查 TOR、公共代理和垃圾邮件发送者数据库并提供此信息。

Example response:

示例响应:

{
  "ip": "182.35.213.213",
  "country_code": "US",
  "country_name": "United States",
  "region_code": "CA",
  "region_name": "California",
  "city": "San Francisco",
  "zip_code": "94107",
  "time_zone": "America/Los_Angeles",
  "latitude": 32.7697,
  "longitude": -102.3933,
  "suspicious_factors": {
    "is_proxy": true,
    "is_tor_node": true,
    "is_spam": true,
    "is_suspicious": true // true if any of other fields (is_proxy, is_tor_node, is_spam) is true
  }
}