Improved geolocation error handling, explicit timeout, fixes #61
This commit is contained in:
parent
7e0bfa35a5
commit
72a1070e87
@ -2,10 +2,12 @@ Leaflet Changelog
|
||||
=================
|
||||
|
||||
## 0.2 (master)
|
||||
|
||||
* Added WMS support (L.TileLayer.WMS), currently EPSG:3857 only ([#50](https://github.com/CloudMade/Leaflet/issues/50)).
|
||||
|
||||
* Added **WMS support** (L.TileLayer.WMS), currently EPSG:3857 only ([#50](https://github.com/CloudMade/Leaflet/issues/50)).
|
||||
* Added `maxZoom` argument to `map.locateAndSetView` method
|
||||
* Disabled zoom animation on Android by default because it's buggy on some devices (will be enabled back when it's stable enough) ([#32](https://github.com/CloudMade/Leaflet/issues/32)).
|
||||
* Fixed a bug where zooming is broken if the map contains a polygon and you zoom to an area where it's not visible ([#47](https://github.com/CloudMade/Leaflet/issues/47)).
|
||||
* Improved geolocation error handling, explicit timeout. ([#61](https://github.com/CloudMade/Leaflet/issues/61))
|
||||
* Fixed a bug where map isn't displayed in Firefox when there's an `img { max-width: 100% }` rule.
|
||||
|
||||
## 0.1 (2011-05-13)
|
||||
|
@ -22,7 +22,7 @@
|
||||
cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
|
||||
cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttribution});
|
||||
|
||||
var map = new L.Map('map').addLayer(cloudmade).setView(new L.LatLng(50.5, 30.51), 15);
|
||||
var map = new L.Map('map').addLayer(cloudmade);
|
||||
|
||||
map.on('locationfound', function(e) {
|
||||
var marker = new L.Marker(e.latlng);
|
||||
@ -31,6 +31,11 @@
|
||||
marker.bindPopup("<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec odio. Quisque volutpat mattis eros. Nullam malesuada erat ut turpis. Suspendisse urna nibh, viverra non, semper suscipit, posuere a, pede.</p><p>Donec nec justo eget felis facilisis fermentum. Aliquam porttitor mauris sit amet orci. Aenean dignissim pellentesque felis.</p>");
|
||||
});
|
||||
|
||||
map.on('locationerror', function(e) {
|
||||
alert(e.message);
|
||||
map.fitWorld();
|
||||
});
|
||||
|
||||
map.locateAndSetView();
|
||||
</script>
|
||||
</body>
|
||||
|
4
dist/leaflet.js
vendored
4
dist/leaflet.js
vendored
@ -86,8 +86,8 @@ a,b||this._objectsPane)},_resetView:function(a,b,c){var d=this._zoom!=b;this.fir
|
||||
{};for(var b=0,c=a.length;b<c;b++)this.addLayer(a[b])},_initControls:function(){this.options.zoomControl&&this.addControl(new L.Control.Zoom);if(this.options.attributionControl)this.attributionControl=new L.Control.Attribution,this.addControl(this.attributionControl)},_rawPanBy:function(a){var b=L.DomUtil.getPosition(this._mapPane);L.DomUtil.setPosition(this._mapPane,b.subtract(a))},_initEvents:function(){L.DomEvent.addListener(this._container,"click",this._onMouseClick,this);L.DomEvent.addListener(this._container,
|
||||
"dblclick",this._fireMouseEvent,this);L.DomEvent.addListener(this._container,"mousedown",this._fireMouseEvent,this);this.options.trackResize&&L.DomEvent.addListener(window,"resize",this.invalidateSize,this)},_onMouseClick:function(a){(!this.dragging||!this.dragging.moved())&&this._fireMouseEvent(a)},_fireMouseEvent:function(a){this.fire("pre"+a.type);this.hasEventListeners(a.type)&&this.fire(a.type,{latlng:this.mouseEventToLatLng(a),layerPoint:this.mouseEventToLayerPoint(a)})},_initInteraction:function(){var a=
|
||||
{dragging:L.Handler.MapDrag,touchZoom:L.Handler.TouchZoom,doubleClickZoom:L.Handler.DoubleClickZoom,scrollWheelZoom:L.Handler.ScrollWheelZoom,shiftDragZoom:L.Handler.ShiftDragZoom},b;for(b in a)a.hasOwnProperty(b)&&a[b]&&(this[b]=new a[b](this),this.options[b]&&this[b].enable())},_onTileLayerLoad:function(){this._tileLayersToLoad--;if(this._tileLayersNum&&!this._tileLayersToLoad&&this._tileBg)clearTimeout(this._clearTileBgTimer),this._clearTileBgTimer=setTimeout(L.Util.bind(this._clearTileBg,this),
|
||||
500)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(L.DomUtil.getPosition(this._mapPane))},_getNewTopLeftPoint:function(a){var b=this.getSize().divideBy(2);return this.project(a).subtract(b).round()},_limitZoom:function(a){var b=this.getMinZoom(),c=this.getMaxZoom();return Math.max(b,Math.min(c,a))}});L.Map.include({locate:function(){navigator.geolocation?navigator.geolocation.getCurrentPosition(L.Util.bind(this._handleGeolocationResponse,this),L.Util.bind(this._handleGeolocationError,this)):this.fire("locationerror",{message:"Geolocation not supported."});return this},locateAndSetView:function(){this._setViewOnLocate=!0;return this.locate()},_handleGeolocationError:function(a){this.fire("locationerror",{message:a.message})},_handleGeolocationResponse:function(a){var b=180*a.coords.accuracy/4E7,
|
||||
c=b*2,d=a.coords.latitude,e=a.coords.longitude,f=new L.LatLng(d-b,e-c);b=new L.LatLng(d+b,e+c);f=new L.LatLngBounds(f,b);if(this._setViewOnLocate)this.fitBounds(f),this._setViewOnLocate=!1;this.fire("locationfound",{latlng:new L.LatLng(d,e),bounds:f,accuracy:a.coords.accuracy})}});L.Map.include({openPopup:function(a){this.closePopup();this._popup=a;return this.addLayer(a)},closePopup:function(){this._popup&&this.removeLayer(this._popup);return this}});L.Map.include(!L.Transition||!L.Transition.implemented()?{}:{setView:function(a,b,c){b=this._limitZoom(b);var d=this._zoom!=b;if(this._loaded&&!c&&this._layers&&(c=this._getNewTopLeftPoint(a).subtract(this._getTopLeftPoint()),d?this._zoomToIfCenterInView&&this._zoomToIfCenterInView(a,b,c):this._panByIfClose(c)))return this;this._resetView(a,b);return this},panBy:function(a){if(!this._panTransition)this._panTransition=new L.Transition(this._mapPane,{duration:0.3}),this._panTransition.on("step",this._onPanTransitionStep,
|
||||
500)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(L.DomUtil.getPosition(this._mapPane))},_getNewTopLeftPoint:function(a){var b=this.getSize().divideBy(2);return this.project(a).subtract(b).round()},_limitZoom:function(a){var b=this.getMinZoom(),c=this.getMaxZoom();return Math.max(b,Math.min(c,a))}});L.Map.include({locate:function(){navigator.geolocation?navigator.geolocation.getCurrentPosition(L.Util.bind(this._handleGeolocationResponse,this),L.Util.bind(this._handleGeolocationError,this),{timeout:1E4}):this.fire("locationerror",{code:0,message:"Geolocation not supported."});return this},locateAndSetView:function(a){this._setViewOnLocate=!0;this._maxLocateZoom=a||Infinity;return this.locate()},_handleGeolocationError:function(a){a=a.code;this.fire("locationerror",{code:a,message:"Geolocation error: "+
|
||||
(a==1?"permission denied":a==2?"position unavailable":"timeout")+"."})},_handleGeolocationResponse:function(a){var b=180*a.coords.accuracy/4E7,c=b*2,d=a.coords.latitude,e=a.coords.longitude,f=new L.LatLng(d-b,e-c);b=new L.LatLng(d+b,e+c);f=new L.LatLngBounds(f,b);if(this._setViewOnLocate)b=Math.min(this.getBoundsZoom(f),this._maxLocateZoom),this.setView(f.getCenter(),b),this._setViewOnLocate=!1;this.fire("locationfound",{latlng:new L.LatLng(d,e),bounds:f,accuracy:a.coords.accuracy})}});L.Map.include({openPopup:function(a){this.closePopup();this._popup=a;return this.addLayer(a)},closePopup:function(){this._popup&&this.removeLayer(this._popup);return this}});L.Map.include(!L.Transition||!L.Transition.implemented()?{}:{setView:function(a,b,c){b=this._limitZoom(b);var d=this._zoom!=b;if(this._loaded&&!c&&this._layers&&(c=this._getNewTopLeftPoint(a).subtract(this._getTopLeftPoint()),d?this._zoomToIfCenterInView&&this._zoomToIfCenterInView(a,b,c):this._panByIfClose(c)))return this;this._resetView(a,b);return this},panBy:function(a){if(!this._panTransition)this._panTransition=new L.Transition(this._mapPane,{duration:0.3}),this._panTransition.on("step",this._onPanTransitionStep,
|
||||
this),this._panTransition.on("end",this._onPanTransitionEnd,this);this.fire(this,"movestart");this._panTransition.run({position:L.DomUtil.getPosition(this._mapPane).subtract(a)});return this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){this.fire("moveend")},_panByIfClose:function(a){if(this._offsetIsWithinView(a))return this.panBy(a),!0;return!1},_offsetIsWithinView:function(a,b){var c=b||1,d=this.getSize();return Math.abs(a.x)<=d.x*c&&Math.abs(a.y)<=d.y*c}});L.Map.include(!L.DomUtil.TRANSITION?{}:{_zoomToIfCenterInView:function(a,b,c){if(this._animatingZoom)return!0;if(!this.options.zoomAnimation)return!1;var d=Math.pow(2,b-this._zoom);c=c.divideBy(1-1/d);if(!this._offsetIsWithinView(c,1))return!1;this._mapPane.className+=" leaflet-zoom-anim";c=this.containerPointToLayerPoint(this.getSize().divideBy(2)).add(c);this._prepareTileBg();this._runAnimation(a,b,d,c);return!0},_runAnimation:function(a,b,c,d){this._animatingZoom=!0;this._animateToCenter=a;this._animateToZoom=
|
||||
b;a=L.DomUtil.TRANSFORM;L.Browser.gecko&&(this._tileBg.style[a]+=" translate(0,0)");L.Browser.android?(this._tileBg.style[a+"Origin"]=d.x+"px "+d.y+"px",c="scale("+c+")"):c=L.DomUtil.getScaleString(c,d);L.Util.falseFn(this._tileBg.offsetWidth);d={};d[a]=this._tileBg.style[a]+" "+c;this._tileBg.transition.run(d)},_prepareTileBg:function(){if(!this._tileBg)this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),this._tileBg.style.zIndex=1;var a=this._tilePane,b=this._tileBg;b.innerHTML="";
|
||||
b.style[L.DomUtil.TRANSFORM]="";b.style.display="none";b.empty=!0;a.empty=!1;this._tilePane=this._panes.tilePane=b;this._tileBg=a;if(!this._tileBg.transition)this._tileBg.transition=new L.Transition(this._tileBg,{duration:0.3,easing:"cubic-bezier(0.25,0.1,0.25,0.75)"}),this._tileBg.transition.on("end",this._onZoomTransitionEnd,this);this._removeExcessiveBgTiles()},_removeExcessiveBgTiles:function(){for(var a=[].slice.call(this._tileBg.getElementsByTagName("img")),b=this._container.getBoundingClientRect(),
|
||||
|
@ -7,20 +7,32 @@ L.Map.include({
|
||||
if (navigator.geolocation) {
|
||||
navigator.geolocation.getCurrentPosition(
|
||||
L.Util.bind(this._handleGeolocationResponse, this),
|
||||
L.Util.bind(this._handleGeolocationError, this));
|
||||
L.Util.bind(this._handleGeolocationError, this),
|
||||
{timeout: 10000});
|
||||
} else {
|
||||
this.fire('locationerror', {message: "Geolocation not supported."});
|
||||
this.fire('locationerror', {
|
||||
code: 0,
|
||||
message: "Geolocation not supported."
|
||||
});
|
||||
}
|
||||
return this;
|
||||
},
|
||||
|
||||
locateAndSetView: function(maxZoom) {
|
||||
this._setViewOnLocate = true;
|
||||
this._maxLocateZoom = maxZoom || Infinity;
|
||||
return this.locate();
|
||||
},
|
||||
|
||||
_handleGeolocationError: function(error) {
|
||||
this.fire('locationerror', {message: error.message});
|
||||
var c = error.code,
|
||||
message = (c == 1 ? "permission denied" :
|
||||
(c == 2 ? "position unavailable" : "timeout"));
|
||||
|
||||
this.fire('locationerror', {
|
||||
code: c,
|
||||
message: "Geolocation error: " + message + "."
|
||||
});
|
||||
},
|
||||
|
||||
_handleGeolocationResponse: function(pos) {
|
||||
@ -34,7 +46,8 @@ L.Map.include({
|
||||
bounds = new L.LatLngBounds(sw, ne);
|
||||
|
||||
if (this._setViewOnLocate) {
|
||||
this.fitBounds(bounds);
|
||||
var zoom = Math.min(this.getBoundsZoom(bounds), this._maxLocateZoom);
|
||||
this.setView(bounds.getCenter(), zoom);
|
||||
this._setViewOnLocate = false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user