【问题标题】:How can I access the 'marker' object inside a google.map object?如何访问 google.map 对象中的“标记”对象?
【发布时间】:2014-10-25 16:06:32
【问题描述】:

我在 Drupal 中使用谷歌地图(但我认为这与我的问题无关)。 在一个视图(Drupal 中的页面显示)上,我在谷歌地图上显示标记。 我在外部块中显示地图上标记的链接。

我看过this example,但我认为相反: 我想,当我点击地图标记时,我想显示(或强调)相关链接(和额外数据)。

(function ($) {
    Drupal.behaviors.gmap = {
        attach: function (context, settings) {
            //'auto1map' is the name of my map
            $.each(Drupal.settings.gmap.auto1map.markers, function(index, mymarker){
                console.log(mymarker);

                //using 'mymarker' doesn't trigger the mouseover
                //I need the 'mymarker.marker' marker-object instead
                var marker = ???; 

                //I want to do something like this
                google.maps.event.addListener(marker, 'click', function(e){
                    console.log(index+' finally clicked');
                });
                // ...the rest of my code
            });
        }
    }
})(jQuery);

一个 mymarker 对象在 Chrome 控制台中是这样的:

Object {text: "mytext", latitude: "46.3611897222", longitude: "1.60658955574", title: "Title of mymarker", markername: "mymarkername"…}
"": "mytext"
   latitude: "46.3611897222"
   longitude: "1.60658955574"
|> marker: Vl
   markername: "mymarkername"
   offset: ""
|> opts: Object
   text: "mytext"
   title: "Title of mymarker"

PS:|> 代表三角形可扩展图标

我需要定位那个标记对象,而不是 mymarker 对象

标记部分包含:

marker: Vl
|> Be: Object
|> __e3_: Object
|> __gm: Mf
|> anchorPoint: T
|> changed: function (a){a in e&&(delete this[Gc],d.k[Ee(this)]=this,hP(d))}
   clickable: true
   closure_uid_887014485: 9
|> gm_accessors_: Object
|> gm_bindings_: Object
|> icon: om.MarkerImage
|> map: Sl
|> position: R
   shadow: null
   title: "Title of mymarker"
   visible: true

如果我尝试mymarker.latitude,我会得到纬度值

如果我尝试$(mymarker).opts,我会得到“opts”对象

但我需要的是获得“标记”部分,但我无法获得它: 我试过了

console.log(mymarker.marker) => 未定义

console.log($(mymarker).marker) => $(mymarker) 对象

console.log($(mymarker).get('marker)) => 未定义

我不知道什么是以及如何转换为“Vl”,这似乎是标记对象的类型(“标记”类型?)。 我尝试了api guide 我无法在任何地方找到有关如何访问这些数据的帮助,

编辑 - 我编辑了我的 js 代码以显示我需要的内容。

编辑 - 感谢@Dr.Molle 和 AlexK,我成功实现了我的目标。

这是更新版本:我有一个 Drupal 视图,显示带有标记的谷歌地图,我还有一个“附件”,在不同的块中显示 html 列表中的相同标记。 当我点击一个标记时,我想显示相应的列表元素(并隐藏其他元素)。

(function ($) { 
  //When click on marker, act on related link
  Drupal.behaviors.gmap = {
    attach: function (context, settings) {
      //I get all the html list elements 
      var li = $('.view-content .views-field-title').parent();
      //and hide them all
      li.hide();

      //Set index to associate list element and markers
      var index = 0;
      var lastindex = -1;

      //reference for the map
      var map=Drupal.gmap.getMap('auto1map');
      //bind addmarker-handler, the marker is available as callback-argument 
      map.bind('addmarker', function (m) {
        var element = $(li)[index];
        m.marker.index=index;

        //remove listeners set automatically by the library  
        google.maps.event.clearListeners(m.marker, 'click');

        //add  your custom listener
        google.maps.event.addListener(m.marker, 'click',function(){
          //Hide last shown element
          if (lastindex != -1){
            $($(li)[lastindex]).hide();
          }
          //Show the html element corresponding to the marker
          $(element).show();
          //Set new lastindex
          lastindex = parseInt(m.marker.index);
        });

        index++;
      });
    }
  };
})(jQuery);

【问题讨论】:

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


    【解决方案1】:

    我不熟悉 drupal 和这个插件,但问题似乎不是 如何 访问标记,问题是 何时 访问标记(google.maps.Marker-instances)。

    函数运行时,latitudelongitude 等标量值已经可以通过设置获得,但稍后会创建 google.map.Markers。

    您在展开控制台时看到标记,但是您看到的将是您展开对象时的对象状态,而不是您调用console.log时的对象状态

    可能的解决方案: 在地图中添加一个addmarker-listener(将在将标记添加到地图时执行),您可以在其中分配自定义点击侦听器:

    (function ($) {
        Drupal.behaviors.gmap = {
            attach: function (context, settings) {
              //reference for the map
              var map=Drupal.gmap.getMap('auto1map');
    
              //bind addmarker-handler, the marker is available as callback-argument  
              map.bind('addmarker', function (m) {
                //remove listeners set automatically by the library  
                google.maps.event.clearListeners(m.marker, 'click');
                //add  your custom listener
                google.maps.event.addListener(m.marker, 'click',function(){
                  alert('This marker is placed \n@'+this.getPosition().toString());
                });
              });
            }
        }
    })(jQuery);
    

    奇怪的是,可以通过设置设置不同类型的点击行为(例如 infoWindow-creation 和 ajax-callbacks),但我没有找到定义简单回调函数的选项。

    【讨论】:

    • 这绝对是绝妙的,恰到好处:这确实是使用正确的听众的问题!也许这是题外话,但如果你不知道 Drupal,你怎么可能知道(不是猜测,我现在非常尊重你 :D)问题出在 addmarker 监听器上,更重要的是:我可以不要访问标记对象,但在控制台中它是可用的,具有所有正确的值。您将如何关联这两个事实,以及您使用 addlistener 的天才想法。我愿意学习如何调试这种令人头疼的问题。无论如何,谢谢。
    • 我使用了这个带有地图和标记的简单 drupal 页面:drupal.manuals-now.com/map/node 并添加了您的代码以查看那里发生了什么。很明显,当标记作为另一个对象的属性可见时,这是一个时间问题,但当我尝试直接访问它时未定义(related question to the console-behaviour)。我通过检查页面加载的脚本找到的 addmarker-listener (GIcon manager)
    • 感谢您的额外解释!我很遗憾我没有足够的“积分”来为您 +1。我没看到你的最后一句话指的是哪里,但我明天早上会检查。
    • 好的,所以您使用编辑器逐个检查了这些文件的代码?您没有使用检查器找到侦听器并找到埋在方法/原型中的“addmarker”?这就是我想要理解的。也许有资源可以了解如何挖掘这些检查器(Chrome、FF ...)以找到此类信息。或者,如果您说否则,我只需要滚动所有 js 文件即可找到答案。无论如何,再次感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2016-06-13
    相关资源
    最近更新 更多