Google地图:如何创build自定义InfoWindow?

地图标记的默认Google地图信息窗口非常圆。 如何创build一个方形angular的自定义InfoWindow?

编辑经过一番狩猎后,这似乎是最好的select:

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

您可以看到我在Dive Seven(一个在线潜水logging网站)上使用的InfoBubble的定制版本。 它看起来像这样:


Google 提供了演示如何实现自定义信息窗口的演示 。 它需要相当数量的代码,但似乎很简单。


这里还有一些例子。 但是,它们绝对不像屏幕截图中的示例那么好看。

您可以单独使用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类或只是添加一个新的元素。

玩弄元素来得到你需要的东西…

我发现InfoBox是高级造型的完美select。

InfoBox的行为类似于google.maps.InfoWindow ,但它支持高级样式的几个附加属性。 一个信息框也可以用作地图标签。 一个InfoBox也会触发与google.maps.InfoWindow相同的事件。

在您的页面中添加http://code.google.com/p/google-maps-utility-library-v3/source/browse/trunk/infobox/src/infobox.js

然后使用这个例子: http : //google-maps-utility-library-v3.googlecode.com/svn/tags/infobox/1.1.5/docs/examples.html

deviseinfowindow是相当简单的香草JavaScript。 写这个的时候我使用了这个线程的一些信息。 我还考虑到了早期版本的ie可能存在的问题(尽pipe我没有对它们进行testing)。

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

代码像平常一样创buildinfowindow(不需要插件,自定义覆盖或巨大代码),使用带有id的div来保存内容。 这给系统中的钩子,我们可以用一个简单的外部样式表来获取正确的元素来操作。

有一些额外的部分(这是不是很严格需要),处理事情就像给它一个closures信息窗口图像的股利钩。

最后一个循环隐藏了指针箭头的所有部分。 我自己需要这个,因为我想在infowindow上拥有透明度,箭头挡在了路上。 当然,使用钩子,改变代码来replace你select的PNG的箭头图像也应该相当简单。

如果你想改变它为jQuery(不知道为什么你会),那应该是相当简单的。

我通常不是一个JavaScript开发人员,所以任何想法,意见,批评欢迎:)

下面的一段代码可能会帮助你。

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

这里有一篇文章< 如何find完美缩放的谷歌地图上的多个地址 >帮助我实现了这一目标。 你可以参考它的工作JS小提琴链接和完整的例子。

我不确定FWIX.com是如何做的,但我敢打赌,他们正在使用自定义覆盖 。

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

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

这是一个纯粹的CSS解决scheme,基于谷歌当前的infowindow示例:

https://developers.google.com/maps/documentation/javascript/examples/infowindow-simple

 #map *{ overflow: visible; } #content{ display: block; position: absolute; bottom: -8px; left: -20px; background-color: white; z-index: 10001; } 

这是一个快速的解决scheme,适用于小型信息窗口。 如果有帮助,不要忘了投票

你甚至可以在popup的容器/canvas上附加你自己的css类,或者你想要什么。 目前的谷歌地图3.7popup式窗体元素,它代表popup式div容器的样式。 所以在谷歌地图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'; } } }); 

element.previousElementSibling不存在于IE8-所以如果你想使它在它的工作,请按照此 。

查看最新的InfoWindow参考以了解更多事件

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

我想我最好的答案是在这里: https : //codepen.io/sentrathis96/pen/yJPZGx

我不能赞扬这一点,我从另一个codepen用户分叉,以解决谷歌地图依赖实际加载

记下呼叫:

 InfoWindow() // constructor