Adding geolocation data to form can be helpful to understand where your visitors are coming from. For instance, it’s quite useful to know the timezone of someone who contacted you... Let’s see how to implement this using JavaScript.
For easier understanding, let’s split this into 3 steps:
I had the opportunity to try quite a few geolocation services. In my experience, it’s hard to find a free and reliable API. By reliable, I mean a service that won't be closing down anytime soon or that don't become paid.
For a long time, I was using Telize but it suddenly stopped working on several sites I'm maintaining. I immediately headed to their main site to see "The public API will permanently shut down on November 15th, 2015. More information can be found here. To continue using Telize after this date, please spin up your own instance or subscribe to a paid plan."
So here’s two public geolocation HTTP API that I end up using instead:
If you’re using jQuery, making a GET HTTP request couldn't be easier thanks to $.getJSON(). I will therefore skip the jQuery version for now and explain to to do the same in vanilla JavaScript.
What are the advantages of using JSONP over JSON? Simply put: much less code required than using JSON but little bit less control over it. Since JSONP is actually JavaScript, there’s no need to parse the response and more importantly it helps overcoming CORS problems. Making an HTTP request with JSONP can be as simple as this:
<!-- The below JSONP request is async -->
<script type="text/javascript" src="https://freegeoip.net/json/?callback=formGeolocation" async></script>
I used the HTML attribute async
to make this request asynchronous so that it doesn't slow slown the page rendering. But if you need to use Geolocation right away, you should probably remove it.
We then need to create our callback function formGeolocation
and use the JSONP response that it contains. This function needs to be loaded before the GET HTTP request is executed, otherwise it’ll result in an error.
function formGeolocation(jsonp) {
// Get the form ID
var form = document.getElementById('contact_form');
// Loop through the objects
Object.keys(jsonp).forEach(function (key) {
dynamicItems += '<input type="hidden" name="geolocation[' + key + ']" value="' + jsonp[key] + '"/>';
});
// Append only once for better performance
form.innerHTML += dynamicItems;
}
Please leave your feedback in the comments.