kristerkari / jQuery-Geolocator

A Geolocation API plugin for jQuery or Zepto

Home Page:http://krister.fi/jquery.geolocator/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

jQuery (Zepto) Geolocator

Features

jQuery Geolocator is a plugin that takes a list of addresses and gets a distance and directions to each address from your current geolocation position. If available, it uses W3C Geolocation API (HTML5 Geolocation) to find your current location, and queries Google Maps API for distances to each address inside your list. If the visitor's browser is old and does not support the Geolocation API, the more inaccurate IP address based geolocation from Google is used.

This plugin is a fork of / based on HTML5-GeoLocation-jQuery-Plugin by teleject.

Why did I decide to make a new plugin instead of using the old one?

At first I only wanted to add some options to the original plugin, and fix variables that were leaking into the global scope. I soon realized that there were far more things that I wanted change inside the plugin, so I ended up rewriting many parts of the plugin code.

Demo

Click here for a demo

Dependencies

To use the plugin the following scripts/libraries are required, and should be included on your page:

  • jQuery (requires at least version 1.6) or Zepto (needs a custom build like this rake concat[-detect:-form:data:selector:fx_methods] dist you can find the mentioned custom build inside the dist folder)
  • Google JS API + API key
  • Google Maps API

How to use

1. Markup

You need to wrap each address inside your list item with Microformats hCard ADR defined classes, and somewhere inside the list item an element that has distance as its classname (that is where the distance for that address is printed). Classnames used in default markup can be changed via plugin options.

Example markup:

<div id="locations">
<ul>
  <li>
    <div class="adr">
      <span class="street-address">2907 E MLK Jr Blvd.</span>, 
      <span class="locality">Austin</span>, 
      <span class="region">TX</span>, 
      <span class="postal-code">78702</span>
    </div>
    <div class="distance"></div>
  </li>
  <li>
    <div class="adr">
      <span class="street-address">Aleksanterinkatu 52</span>
      <span class="postal-code">00100</span>, 
      <span class="locality">Helsinki</span> 
      <span class="country-name">Finland</span>
    </div>
    <div class="distance"></div>
  </li>
</ul>
</div>

If you want, you can optionally set latitude and longitude of the address as data attributes to .adr elements, to get more accurate results:

<div class="adr" data-latitude="##.######" data-longitude="##.######">
...
</div>

You can also have multiple unordered list elements with different addresses inside your locations element. However, you should only have one instance of the plugin running, since running multiple instances of the plugin seems to be quite buggy.

2. Needed scripts

Before you use the plugin, make sure that you have jQuery (or Zepto), Google JS API, Google Maps and jQuery Geolocator plugin linked inside your <head> tag, or before your ending </body> tag (recommended).

<script src="//www.google.com/jsapi?key=YOUR_GOOGLE_API_KEY"></script>
<script src="//maps.googleapis.com/maps/api/js?sensor=true"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<script src="js/jquery.geolocator.js"></script>

3. Javascript

After you have all script tags included, you can call the plugin on a list (unordered list, ul - by default) with your custom options. (Remember to wrap your code in jQuery's or Zepto's .ready() function)

Here we are changing the plugin to use kilometers instead of miles:

<script>
$(document).ready(function() {
	$("#locations").geolocator({ distanceBigStr: 'km', distanceSmallStr: 'm' });
});
</script>

You can also use the plugin without manually including Google API script tags, but it is not recommended since it will slow down the time it takes to find geolocation/distances as it has to load the Google APIs after the plugin has been initialized. This can be done with the apiKey option:

<script>
$(document).ready(function() {
	$("#locations").geolocator({ apiKey: 'YOUR_GOOGLE_API_KEY' });
});
</script>

If you later need to refresh the plugin, you can call it again on the same element without any options:

$("#locations").geolocator();

Info about Zepto support

Default build of Zepto.js does not provide all the methods that are needed, so you need to build a custom version of Zepto.

This is the custom build of Zepto that you can find inside the dist folder:

rake concat[-detect:-form:data:selector:fx_methods] dist

Plugin options: General settings

Following options can be used to customize the plugin:

sorting

Set to false if you don't want addresses to be sorted by distance automatically. Default: true.

manualCheck

Set to true if you want to disable automatic geolocating, and let the user manually geolocate using a link. Default: false.

Example:

<a href="#" id="check">Check geolocation</a>

notificationStyle

A notification style for your 'getting geolocation...' text. 'fade' or 'show'. Default: 'show'.

apiKey

An Google API key is needed if you want the plugin to download all Google APIs for you. Default: null.

targetBlank

Set to true to open all 'Show directions' links in a new browser tab/window. Default: false.

debugMode

Set to true to enable debug mode. This mode logs all Geolocation and Google API errors to you browser's Javascript console. Default: false.

Plugin options: Elements

checkElem

Element selector (a link element) for manualCheck setting. Default: '#check'.

recheckElem

Element selector (a link element) to recheck geolocation. Default: '#recheck'.

geodataElem

Element that displays your own location. Default: '#geodata'.

notificationElem

Element that displays a 'getting geolocation...' notification when the plugin is running. Default: '.notification'.

listParentElem

Parent element for a list (usually ul or ol). Default: 'ul'.

listElem

Child element for list items. Default: 'li'.

distanceElem

Element that displays the distance for each address. Has to be a child of listElem element. Default: '.distance'.

geoAdrElem

Element that holds each address. Has to be a child of listElem element. Microformats hCard ADR defined classes. Default: '.adr'.

mapsLinkElem

Element that is appended to each list item. Has to be a child of listElem element. Default: '.maps-link'.

locationsElem

With this setting you can assign your main element like this $.geolocator({ locationsElem: '#locations' });. Default: null.

Plugin options: Language strings

You can change the default texts used by the plugin to your own language.

distanceBigStr

Language string for big distance (miles or kilometers). If default string miles is changed, kilometers will be used. Default: 'miles'.

distanceSmallStr

Language string for small distance (meters). Default: 'meters'.

distanceUnknownStr

Language string for unknown distance. Default: 'unknown'.

notFoundStr

Language string that is displayed when your location is not found. Default: 'Could not get your location'.

mapsLinkStr

Language string for a Google Maps link that is showed next to each address. Default: 'Show directions'.

Plugin options: W3C Geolocation API options

enableHighAccuracy

Set to true if you want to get the most accurate location estimate possible. Getting geolocation might take longer if enabled. Default: false.

timeout

The number of milliseconds to wait before timing out. Default: 6000 (6 seconds).

maximumAge

Amount of time in milliseconds that the geolocation result is cached. Default: 60000 (1 minute).

Custom events

The following events are triggered on the element that is running jQuery Geolocator:

  • 'geolocator:fail' when getting geolocation (Geolocation API or Google) fails.
  • 'geolocator:done' when the script has finished running, and getting geolocation was successful.
  • 'geolocator:own-fail' when getting your own location failed.
  • 'geolocator:own-done' when getting your own location was successful.

You can listen to the events by using for example jQuery's .on() (or .bind()):

$("#locations").on("geolocator:done", function(){
  // do something
});

Browser support

The script uses Geolocation API in newer browsers. A fallback to a IP address based geolocation from Google is used in older browsers. It should work in Internet Explorer 7+, Firefox, Safari, Chrome and Opera. Even though the browser support is quite good, the performance might not be that good in older desktop and mobile browsers.

Reporting issues and bugs

If something is not working for you or you find a bug, please open a new issue at the issues section.

Developer

Developed by Krister Kari.

License

This software is released under the MIT license

Changelog

  • 1.0.4 (19.08.2012) - Added support for Zepto.js
  • 1.0.3 (19.08.2012) - Added a workaround for Google API limitations and added Grunt as a build tool
  • 1.0.2 (01.05.2012) - added clearTimeout to fix a bug in older browsers, and did a small change to link creation
  • 1.0.1 (27.04.2012) - 'targetBlank' option for links, support for country names (.country-name) and small fixes to loops.
  • 1.0.0 (20.04.2012) - Initial release

About

A Geolocation API plugin for jQuery or Zepto

http://krister.fi/jquery.geolocator/

License:MIT License


Languages

Language:JavaScript 100.0%