JavaScript « Определение страны пользователя через JS

Всем привет! Есть такая задача, нужно получать страну пользователя, только не через PHP а с помощью JS и соответственно скрывать или показывать некоторые элементы интерфейса.

Нашел на эту тему одну статью, в которой говорилось что можно подключать вот такую js: http://j.maxmind.com/app/geoip.js

и она будет предоставлять функцию geoip_country_code()

Но непонятно что это за ресурс, надежный ли он. Может кто то знает более правильный способ определения страны пользователя через JS?

1 ответов


Нет, через JS определить страну нельзя. Максимум - язык в системе пользователя, и то не уверен. Вижу 2 варианта:

1. Как описано у вас - подключить внешний сервис, который по ip-адресу определяет страну. Вполне неплохой вариант, в большинстве случаев будет работать.
2. Определять координаты пользователя (см. Geolocation API) и по ним уже определять - что за страна, но он геморнее. Во-первых придётся как-то сопоставлять координаты, то есть знать точно откуда до куда какая страна, во-вторых когда сайт запрашивает местоположение пользователя - пользователь должен разрешить определение. Соответственно - нет разрешения, не из чего определять где он находится.

Я бы использовал 1-й вариант, сторонний сервис, имеющий уже базу ip-адресов по странам - по-моему вполне. Главное, чтобы сервис не падал и из-за него не тормозил сайт. MaxMind вроде известный ресурс. Для СНГ есть http://ipgeobase.ru/ .


Тормозов не замечал, а насчёт стабильности на крайний случай можно создать вот такой вот скрипт который проверяет сторонний JS и даёт данные по умолчанию в случае падения. Почему сделал классом - потому что через foreach можно получить общую картинку данных даже не зная названия сторонних функций...


var geoip = new function() {
  this.countryCode = window.geoip_country_code ? geoip_country_code() : '';
  this.countryName = window.geoip_country_name ? geoip_country_name() : '';
  this.city = window.geoip_city ? geoip_city() : '';
  this.region = window.geoip_region ? geoip_region() : '';
  this.regionName = window.geoip_region_name ? geoip_region_name() : '';
  this.latitude = window.geoip_latitude ? geoip_latitude() : '';
  this.longitude = window.geoip_longitude ? geoip_longitude() : '';
  this.postalCode = window.geoip_postal_code ? geoip_postal_code() : '';
  this.areaCode = window.geoip_area_code ? geoip_area_code() : '';
  this.metroCode = window.geoip_metro_code ? geoip_metro_code() : '';
}

var s="";for(var e in geoip)s=s+"\n"+e+"="+geoip[e];
alert(s);