Google Maps:如何创建自定义的InfoWindow?


Answers:


83

编辑经过一番摸索,这似乎是最好的选择:

https://github.com/googlemaps/js-info-bubble/blob/gh-pages/examples/example.html

您可以在Dive Seven(用于在线水肺潜水记录的网站)上看到此InfoBubble的自定义版本。看起来像这样:


有一些更多的例子在这里。但是,它们的外观肯定不如屏幕截图中的示例所示。


1
@TWilly,谢谢。该项目移至GitHub。我已经更新了网址。
Drew Noakes

请更新您的链接和演示地图,因为它们不起作用。
MrUpsidown

17

您可以单独使用jquery修改整个InfoWindow ...

var popup = new google.maps.InfoWindow({
    content:'<p id="hook">Hello World!</p>'
});

在这里,<p>元素将充当实际InfoWindow的钩子。一旦domready触发,该元素将变为可用并可以使用javascript / jquery进行访问,例如$('#hook').parent().parent().parent().parent()

下面的代码只是在InfoWindow周围设置了2个像素的边框。

google.maps.event.addListener(popup, 'domready', function() {
    var l = $('#hook').parent().parent().parent().siblings();
    for (var i = 0; i < l.length; i++) {
        if($(l[i]).css('z-index') == 'auto') {
            $(l[i]).css('border-radius', '16px 16px 16px 16px');
            $(l[i]).css('border', '2px solid red');
        }
    }
});

您可以执行任何操作,例如设置新的CSS类或添加新元素。

试玩元素以获得所需的东西...


4
这是一个肮脏的骇客,随时可能停止运作!
Billy 2014年

2
hack-当然。天才-绝对!
尼克·米切尔

1
肯定会在页面中重复的元素ID,这不是一个好习惯。ID在页面中应该是唯一的。
菲利普·拉沃

@PhilippeLavoie您可以在每次创建新的信息窗口时向ID添加一个计数。
ATOzTOA


5

使用香草javascript设置信息窗口的样式非常简单。在编写本文时,我使用了该线程的一些信息。我还考虑了早期版本的ie可能存在的问题(尽管我尚未对其进行测试)。

var infowindow = new google.maps.InfoWindow({
  content: '<div id="gm_content">'+contentString+'</div>'
});

google.maps.event.addListener(infowindow,'domready',function(){
  var el = document.getElementById('gm_content').parentNode.parentNode.parentNode;
  el.firstChild.setAttribute('class','closeInfoWindow');
  el.firstChild.setAttribute('title','Close Info Window');
  el = (el.previousElementSibling)?el.previousElementSibling:el.previousSibling;
  el.setAttribute('class','infoWindowContainer');
  for(var i=0; i<11; i++){
    el = (el.previousElementSibling)?el.previousElementSibling:el.previousSibling;
    el.style.display = 'none';
  }
});

该代码使用具有ID的div来照常创建信息窗口(无需插件,自定义叠加层或庞大的代码),以容纳内容。这为系统提供了一个挂钩,我们可以使用它来获取正确的元素,以使用简单的外部样式表进行操作。

还有一些额外的部分(并非严格需要),这些部分可以处理诸如将div插入其中包含关闭信息窗口图像的div的操作。

最后的循环隐藏了指针箭头的所有部分。我自己需要这个,因为我想在信息窗口中保持透明,而箭头却挡住了。当然,使用钩子,更改代码以将箭头图像替换为您选择的png也应该非常简单。

如果您想将其更改为jquery(不知道为什么这样做),那应该很简单。

我通常不是JavaScript开发人员,因此欢迎您提出任何想法,评论或批评:)


1
我不知道您是否听说过,但是有一些新的东西叫做“输入”和“空间”,当您在计算机上书写时,它们实际上会创建空间。通常在将内容作为代码编写时很有用,这样您的眼睛就不会因尝试阅读而流血:)
Chrillewoodz

4

下面的代码可能会帮助您。

var infowindow = new google.maps.InfoWindow();
 google.maps.event.addListener(marker, 'mouseover', (function(marker) {
            return function() {
                var content = address;
                infowindow.setContent(content);
                infowindow.open(map, marker);
            }
          })(marker));

这是一篇文章< 如何使用完美缩放在Google地图上定位多个地址 >,帮助我实现了这一点。您可以参考它来使用JS Fiddle链接和完整示例。


2

我不确定FWIX.com的具体操作方式,但是我敢打赌他们正在使用自定义叠加层


自定义OVerlay是否具有与普通Google地图标记相同的属性?意思是,我还可以做的setIcon,setZIndex等具有自定义背景画面我不得不重新实现所有这些功能?
SarahBeale 2010年

不可以,自定义叠加层仅允许在地图上进行渲染的基本功能,如果需要setIcon,setZindex等,则必须自己实现。
Timothy Groote 2012年

2

您可以使用下面的代码删除样式默认的inforwindow。在可以将HTML代码用于inforwindow之后:

var inforwindow = "<div style="border-radius: 50%"><img src='URL'></div>"; // show inforwindow image circle
marker.addListener('click', function() {
    $('.gm-style-iw').next().css({'height': '0px'}); //remove arrow bottom inforwindow
    $('.gm-style-iw').prev().html(''); //remove style default inforwindows
});

删除样式默认inforwindows-到目前为止,这是所有SO中最好的解决方案
-djdance


1

您甚至可以在弹出式容器/画布上添加自己的css类,或添加所需的样式。当前的Google Maps 3.7具有以canvas元素样式设置的弹出窗口,该弹出窗口在代码中添加了popup div容器。因此,在googlemaps 3.7中,您可以通过popup的domready事件进入渲染过程,如下所示:

var popup = new google.maps.InfoWindow();
google.maps.event.addListener(popup, 'domready', function() {
  if (this.content && this.content.parentNode && this.content.parentNode.parentNode) {
    if (this.content.parentNode.parentNode.previousElementSibling) {
      this.content.parentNode.parentNode.previousElementSibling.className = 'my-custom-popup-container-css-classname';
    }
  }
});

IE8-中不存在element.previousElementSibling,因此,如果要使其起作用,请按照以下步骤操作

查看最新的InfoWindow参考以获取事件等信息。

我发现这在某些情况下最干净。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.