How to Get a Website User's Location in JavaScript
How can we obtain our website user’s location in JavaScript?
There are lots of ways to get a user’s location in JavaScript, including the native HTML Geolocation API, third-party services, and the Internationalization Intl
object.
1. Using ECMAScript’s Internationalization Intl
object
We can use ECMAScript’s Intl
object to get a user’s timezone as well as a rough guess of their country (timezones span many countries).
This is a great option because it does not require user permission or any external APIs.
Running the following line of code will give us a timezone.
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
Depending on where you are, it might return a string like America/Denver
.
Suppose we have two maps.
countries
, which maps country abbreviations to country nametimezones
, which maps timezones to country abbreviations and other related geodata
Those maps might look something like this.
const countries = {
...,
US: "United States of America",
UY: "Uruguay",
...
};
const timezones = {
...,
"America/Denver": {
u: -420,
d: -360,
c: ["US"]
},
"America/Detroit": {
u: -300,
d: -240,
c: ["US"]
},
...
};
The entire map of
countries
can be found here. The entire map oftimezones
can be found here.
Assuming we have countries
and timezones
declared and initialized in our code, we can obtain a website visitor’s country by linking timezones to countries.
const getCountry = () => {
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
if (!timezone || timezone === "") return null;
const countryAbbreviation = timezones[timezone].c[0];
const country = countries[countryAbbreviation];
return country;
}
2. Using the Geolocation API
We can also use the Geolocation API to obtain a user’s geographical position (longitude/latitude). This API is now standard in all modern browsers.
const getLocation = () => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition, handleError);
} else {
console.error("Geolocation is not supported by this browser.");
}
}
const handleError = (error) => {
console.error(`ERROR(${error.code}): ${error.message}`);
}
const showPosition = (position) => {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
console.log(`Lat: ${latitude}, Long: ${longitude}`;
}
This API only returns latitude and longitude; in order to obtain useful information from this (e.g. country, city), we’ll likely need to use another service.
Be sure to read the Mozilla documentation to explore the capabilities of this Geolocation API.
3. Using an external API
The last option is to use a third-party service, generally available through an API we call from the client.
There are lots of options when it comes to geolocation, but most (if not all) are rate limited and have a subscription fee.
Some APIs may include: ipinfo.io, MaxMind, ipregistry, and IP2Location.
Calling the API might look something like this:
const res = await fetch(API_URL);
const json = await res.json();
// Do something with the result