【问题标题】:Get google.maps.Map instance from a HTMLElement从 HTMLElement 获取 google.maps.Map 实例
【发布时间】:2012-05-02 10:54:19
【问题描述】:

我在页面上有一个现有的地图。我可以使用类似于 document.getElementById() 的内容来选择该元素,以获取 HTMLElement javascript 对象。是否可以获得在地图初始化时创建的 google.maps.Map 的实例,即它是 HTMLElement 对象的属性还是在其原型中?

【问题讨论】:

    标签: javascript google-maps google-maps-api-3


    【解决方案1】:

    我遇到了类似的问题。我想做的就是在创建地图后对其进行操作。我尝试了类似的方法(我认为它也会对您有所帮助)。我已经创建了函数(或多或少像这样):

    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));
    

    这会将标记位置和中心地图更改为相同的坐标。请注意,在调用创建地图的函数时,lnglat 的值是不同的。

    希望对您有所帮助。

    【讨论】:

    • 这是一个很好的、更模块化的答案,而不是在窗口中暴露地图变量。
    【解决方案2】:

    你可以从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。真棒正是我正在寻找的。你是我的英雄。
    • 这假设人们正在使用 jQuery。虽然它确实为答案提供了解决方案,但它并没有以直接的方式做到这一点。
    【解决方案3】:

    如果你使用 Polymer 项目中的 Google-map 组件,你可以像这样获取现有的地图 Dom:

    var map = document.querySelector('google-map');
    

    一旦你有了它,地图的当前实例可以通过以下方式访问:

    var currentMapInstance = map.map;
    

    【讨论】:

      【解决方案4】:

      您无法从 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' 
      

      【讨论】:

      • 为什么要避免'var'? (在最后一行)
      • 因为 'var' 将创建一个新的局部变量(例如,如果在函数内部使用,该变量将在函数返回时被丢弃)而不是覆盖全局变量(如果存在)。例如。如果您有一个名为 map 的全局变量,并且您在任何函数中使用 map = 'anything',那么从现在开始,全局变量的值将是“任何东西”。
      【解决方案5】:

      您在初始化地图时创建了一个实例;

      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'
      

      【讨论】:

      • 但我如何从范围外访问该实例?就我的问题而言,地图已从我无法更改的一行 javascript 初始化,看起来像:new google.maps.Map(el, options);注意实例没有保存到变量中,是否可以访问该实例?
      • 这很好用。在事件监听器中:marker.map.getDiv().
      猜你喜欢
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2014-01-11
      • 2018-02-04
      • 2015-01-06
      • 1970-01-01
      相关资源
      最近更新 更多