123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- (function(window) {
- var HAS_HASHCHANGE = (function() {
- var doc_mode = window.documentMode;
- return ('onhashchange' in window) &&
- (doc_mode === undefined || doc_mode > 7);
- })();
- L.Hash = function(map) {
- this.onHashChange = L.Util.bind(this.onHashChange, this);
- if (map) {
- this.init(map);
- }
- };
- L.Hash.parseHash = function(hash) {
- if(hash.indexOf('#') === 0) {
- hash = hash.substr(1);
- }
- var args = hash.split("/");
- if (args.length == 3) {
- var zoom = parseInt(args[0], 10),
- lat = parseFloat(args[1]),
- lon = parseFloat(args[2]);
- if (isNaN(zoom) || isNaN(lat) || isNaN(lon)) {
- return false;
- } else {
- return {
- center: new L.LatLng(lat, lon),
- zoom: zoom
- };
- }
- } else {
- return false;
- }
- };
- L.Hash.formatHash = function(map) {
- var center = map.getCenter(),
- zoom = map.getZoom(),
- precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
- return "#" + [zoom,
- center.lat.toFixed(precision),
- center.lng.toFixed(precision)
- ].join("/");
- },
- L.Hash.prototype = {
- map: null,
- lastHash: null,
- parseHash: L.Hash.parseHash,
- formatHash: L.Hash.formatHash,
- init: function(map) {
- this.map = map;
- // reset the hash
- this.lastHash = null;
- this.onHashChange();
- if (!this.isListening) {
- this.startListening();
- }
- },
- removeFrom: function(map) {
- if (this.changeTimeout) {
- clearTimeout(this.changeTimeout);
- }
- if (this.isListening) {
- this.stopListening();
- }
- this.map = null;
- },
- onMapMove: function() {
- // bail if we're moving the map (updating from a hash),
- // or if the map is not yet loaded
- if (this.movingMap || !this.map._loaded) {
- return false;
- }
- var hash = this.formatHash(this.map);
- if (this.lastHash != hash) {
- location.replace(hash);
- this.lastHash = hash;
- }
- },
- movingMap: false,
- update: function() {
- var hash = location.hash;
- if (hash === this.lastHash) {
- return;
- }
- var parsed = this.parseHash(hash);
- if (parsed) {
- this.movingMap = true;
- this.map.setView(parsed.center, parsed.zoom);
- this.movingMap = false;
- } else {
- this.onMapMove(this.map);
- }
- },
- // defer hash change updates every 100ms
- changeDefer: 100,
- changeTimeout: null,
- onHashChange: function() {
- // throttle calls to update() so that they only happen every
- // `changeDefer` ms
- if (!this.changeTimeout) {
- var that = this;
- this.changeTimeout = setTimeout(function() {
- that.update();
- that.changeTimeout = null;
- }, this.changeDefer);
- }
- },
- isListening: false,
- hashChangeInterval: null,
- startListening: function() {
- this.map.on("moveend", this.onMapMove, this);
- if (HAS_HASHCHANGE) {
- L.DomEvent.addListener(window, "hashchange", this.onHashChange);
- } else {
- clearInterval(this.hashChangeInterval);
- this.hashChangeInterval = setInterval(this.onHashChange, 50);
- }
- this.isListening = true;
- },
- stopListening: function() {
- this.map.off("moveend", this.onMapMove, this);
- if (HAS_HASHCHANGE) {
- L.DomEvent.removeListener(window, "hashchange", this.onHashChange);
- } else {
- clearInterval(this.hashChangeInterval);
- }
- this.isListening = false;
- }
- };
- L.hash = function(map) {
- return new L.Hash(map);
- };
- L.Map.prototype.addHash = function() {
- this._hash = L.hash(this);
- };
- L.Map.prototype.removeHash = function() {
- this._hash.removeFrom();
- };
- })(window);
|