【发布时间】:2012-05-02 10:54:19
【问题描述】:
我在页面上有一个现有的地图。我可以使用类似于 document.getElementById() 的内容来选择该元素,以获取 HTMLElement javascript 对象。是否可以获得在地图初始化时创建的 google.maps.Map 的实例,即它是 HTMLElement 对象的属性还是在其原型中?
【问题讨论】:
标签: javascript google-maps google-maps-api-3
我在页面上有一个现有的地图。我可以使用类似于 document.getElementById() 的内容来选择该元素,以获取 HTMLElement javascript 对象。是否可以获得在地图初始化时创建的 google.maps.Map 的实例,即它是 HTMLElement 对象的属性还是在其原型中?
【问题讨论】:
标签: javascript google-maps google-maps-api-3
我遇到了类似的问题。我想做的就是在创建地图后对其进行操作。我尝试了类似的方法(我认为它也会对您有所帮助)。我已经创建了函数(或多或少像这样):
function load_map(el_id, lat, lng) {
var point = new google.maps.LatLng(lat,lng);
var myMapOptions = {
scrollwheel:false,
zoom: 15,
center: point,
mapTypeControl: true,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.DROPDOWN_MENU,
position: google.maps.ControlPosition.RIGHT_TOP
},
navigationControl: true,
navigationControlOptions: {
style: google.maps.NavigationControlStyle.SMALL,
position: google.maps.ControlPosition.LEFT_CENTER
},
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById(el_id),myMapOptions);
var marker = new google.maps.Marker({
draggable:true,
map: map,
position: point
});
return({
container:map.getDiv(),
marker:marker,
mapa:map
});
}
这个函数的作用是在调用它在某个容器中创建一个地图之后。
var mapa = load_map('mapa_container', 53.779845, 20.485712);
函数将返回包含制作地图时使用的一些数据的对象。在创建地图本身之后,我可以简单地使用mapa 对象分别操作每个地图上的标记,例如:
mapa.marker.setPosition(new google.maps.LatLng(20,30));
mapa.mapa.setCenter(new google.maps.LatLng(20,30));
这会将标记位置和中心地图更改为相同的坐标。请注意,在调用创建地图的函数时,lng 和 lat 的值是不同的。
希望对您有所帮助。
【讨论】:
你可以从DOM Element得到google.maps.Map对象,有一点小技巧。
在初始化地图对象时,需要将对象存储在元素的数据属性中。
例子:
$.fn.googleMap = function (options) {
var _this = this;
var settings = $.extend({}, {
zoom: 5,
centerLat: 0,
centerLon: 0
}, options);
this.initialize = function () {
var mapOptions = {
zoom: settings.zoom
};
var map = new google.maps.Map(_this.get(0), mapOptions);
// do anything with your map object here,
// eg: centering map, adding markers' events
/********************************************
* This is the trick!
* set map object to element's data attribute
********************************************/
_this.data('map', map);
return _this;
};
// ... more methods
return this;
};
定义一个地图元素后,例如:
var mapCanvas = $('#map-canvas');
var map = mapCanvas.googleMap({
zoom: 5,
centerLat: 0,
centerLong: 0
});
// ... add some pre-load initiation here, eg: add some markers
// then initialize map
map.initialize();
您可以稍后通过使用元素的 ID 获取地图对象,例如:
var mapCanvas = $('#map-canvas');
$('.location').on('click', function () {
// google map takes time to load, so it's better to get
// the data after map is rendered completely
var map = mapCanvas.data("map");
if (map) {
map.panTo(new google.maps.LatLng(
$(this).data('latitude'),
$(this).data('longitude')
));
}
});
通过使用这种方法,您可以在一个页面上拥有多个具有不同行为的地图。
【讨论】:
you can have multiple maps with different behaviors on a page。真棒正是我正在寻找的。你是我的英雄。
如果你使用 Polymer 项目中的 Google-map 组件,你可以像这样获取现有的地图 Dom:
var map = document.querySelector('google-map');
一旦你有了它,地图的当前实例可以通过以下方式访问:
var currentMapInstance = map.map;
【讨论】:
您无法从 DOM Element 获取 google.maps.Map 对象,在该对象上构建了 Google 地图对象。 google.maps.Map 只是一个包装器,它控制DOM Element 用于查看地图,并且该元素没有对其包装器的引用。
如果您的问题只是范围,请将map 作为window 对象的属性,它可以从您页面的任何位置访问。您可以使用以下方法之一将'map' 设为全局:
window.map = new google.maps.Map(..)
或
map = new google.maps.Map(...) //AVOID 'var'
【讨论】:
map 的全局变量,并且您在任何函数中使用 map = 'anything',那么从现在开始,全局变量的值将是“任何东西”。
您在初始化地图时创建了一个实例;
var map = new google.maps.Map(document.getElementById("map_element"), options);
只要您想做一些事情,例如放置标记、更改位置等,您就可以使用该实例。它不是 HTMLElement 对象。但是它有一个getDiv() 方法,可以为您提供它正在操作的 html 元素。
map.getDiv(); // in this case it returns the element with the id 'map_element'
【讨论】:
marker.map.getDiv().