Html 在任何web浏览器中都会出现非常奇怪的显示行为
我正在做一个使用谷歌地图的项目。我使用HTML5地理定位来设置地图。 如果不支持或拒绝地理定位,则我会任意设置地图中心 我的问题在于两件事:Html 在任何web浏览器中都会出现非常奇怪的显示行为,html,css,google-maps-api-3,twitter-bootstrap,responsive-design,Html,Css,Google Maps Api 3,Twitter Bootstrap,Responsive Design,我正在做一个使用谷歌地图的项目。我使用HTML5地理定位来设置地图。 如果不支持或拒绝地理定位,则我会任意设置地图中心 我的问题在于两件事: 关于谷歌地图加载的第一个问题:当地理定位被接受时,地图的加载速度异常缓慢(我现在在中国,这可能是一个原因吗?)。在firefox中,它甚至从不加载。。。但是没有javascript错误 更一般地说,整个网站的显示都是有缺陷的。将地图放大到一定程度后,您应该会看到显示的标记。这很好,但是特定的内容通常在地图下可见。这些内容几乎看不见,或者被一块覆盖在整个窗
- 关于谷歌地图加载的第一个问题:当地理定位被接受时,地图的加载速度异常缓慢(我现在在中国,这可能是一个原因吗?)。在firefox中,它甚至从不加载。。。但是没有javascript错误
- 更一般地说,整个网站的显示都是有缺陷的。将地图放大到一定程度后,您应该会看到显示的标记。这很好,但是特定的内容通常在地图下可见。这些内容几乎看不见,或者被一块覆盖在整个窗口宽度上的难看的黑色块所隐藏
map.setCenter(google.maps.LatLng(loc.coords.latitude, loc.coords.longitude));
一定是
map.setCenter(new google.maps.LatLng(loc.coords.latitude, loc.coords.longitude));
//------------^
建议:
目前,您有一个闪烁的标记礼物。您可以在多个事件上重新加载标记(缩放、更改、拖动、调整大小),删除所有标记并基于XHR响应创建新标记
相反,您应该为标记创建一个缓存(您可以在其中识别它们,例如,基于XHR响应提供的某个ID)。
当您收到新响应时,仅当新标记不在缓存中时才创建新标记,其他标记在地图上保持可见(当您删除/隐藏视口中不可见的标记时,我看不到任何好处)
另外,只更新边界上的标记就足够了,而不是3个事件。我在Google Chrome中得到一个JS错误:
Uncaught TypeError:Cannot call方法'lat'of null
在victorinox.pythonanywhere.com:56
中。你是如何得出这个错误的?我再次通过缩放/拖动地图进行检查,没有错误……奇怪的是,我无法再重现错误。但我还是看不到地图,它只是一个灰色的矩形。奇怪。。。调试已确保geolocalize()函数中的map.setCenter()
在这两种情况下都会执行。但它不会改变地图的状态谢谢,我已经找到了丢失的新地图。我不确定您看到了错误回调的哪个版本,但我认为更新的最新版本考虑了这一方面。这是你为markers更新政策提出的一个很好的建议,我知道这是一个不好的方法,但到目前为止可以想出一个更好的方法。我想一个面向全局变量的缓存可以缓存标记吗?再次感谢!与错误回调相关:不,不,当我拒绝权限时,映射不会加载到FF中。错误回调不会触发(这是当前的firefox实现),但是else分支也不会执行,因为地理位置在FF中可用。哪个版本?与缓存相关的current.related:可以,但也许您应该考虑重新设计实现。目前有几十个全局可访问的函数和变量,最好从单个对象运行整个应用程序。(看看地图API,只有一个名为“google”的全局对象,当您添加另一个API时,它也将成为“google”的一部分,它提供了更多的控制并减少了命名冲突)
$(function() {
//creates the map, no center will be set in createMap()
map = createMap();
//in firefox there will not be set a center
//when user denies permission, because error-callback will not execute
geolocalize();
// when the map
center = map.getCenter();
//will never run, because when the map doesn't have a center
//there will no tiles load
google.maps.event.addListenerOnce(map, 'tilesloaded', function() {
initialize();
});
})