Javascript Google Maps InfoWindows中的滚动位置更改错误是否有解决方案?
我在一个网站上使用标准的内置InfoWindows功能()实现了Google地图。单击右上角的“X”关闭信息窗口时,只要您不在最顶端(window.scrollY==0),window.scrollY就会随着信息窗口的高度而改变。这是我在谷歌搜索问题时发现的一个JSFIDLE,稍加修改后,它很好地显示了这个问题Javascript Google Maps InfoWindows中的滚动位置更改错误是否有解决方案?,javascript,google-maps,Javascript,Google Maps,我在一个网站上使用标准的内置InfoWindows功能()实现了Google地图。单击右上角的“X”关闭信息窗口时,只要您不在最顶端(window.scrollY==0),window.scrollY就会随着信息窗口的高度而改变。这是我在谷歌搜索问题时发现的一个JSFIDLE,稍加修改后,它很好地显示了这个问题 $(function () { demoMap = { initMap: function () { var myLatlng = new
$(function () {
demoMap = {
initMap: function () {
var myLatlng = new google.maps.LatLng(41.097905, -73.405006);
var myOptions = {
zoom: 16,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
this.map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
this.addMarker();
},
addMarker: function () {
var self = this;
var contentString = "<div id='content'>";
contentString += "<div id='title'>Mr. Frosty's Deli and Grill</div>";
contentString += "<div id='info'><p>10 1st Street</p><p>Norwalk, CT 06855</p><p>(203) 956-5767</p><p><a href='http://thebeachburger.com/'>thebeachburger.com</a></p></div></div>";
var latlng = this.map.getCenter();
var marker = new google.maps.Marker({
position: latlng,
map: this.map,
title: "Mr. Frosty's Deli and Grill"
});
var infowindow = new google.maps.InfoWindow({
content: contentString,
disableAutoPan: true
});
google.maps.event.addListener(marker, 'mouseover', function () {
infowindow.setOptions({pixelOffset : self.getInfowindowOffset(self.map, marker)});
infowindow.open(self.map, marker);
});
google.maps.event.addListener(marker, 'mouseout', function () {
infowindow.close();
});
},
getInfowindowOffset: function (map, marker) {
var center = this.getPixelFromLatLng(map.getCenter()),
point = this.getPixelFromLatLng(marker.getPosition()),
quadrant = "",
offset;
quadrant += (point.y > center.y) ? "b" : "t";
quadrant += (point.x < center.x) ? "l" : "r";
if (quadrant == "tr") {
offset = new google.maps.Size(-70, 185);
} else if (quadrant == "tl") {
offset = new google.maps.Size(70, 185);
} else if (quadrant == "br") {
offset = new google.maps.Size(-70, 20);
} else if (quadrant == "bl") {
offset = new google.maps.Size(70, 20);
}
return offset;
},
getPixelFromLatLng: function (latLng) {
var projection = this.map.getProjection();
var point = projection.fromLatLngToPoint(latLng);
return point;
}
}
demoMap.initMap();
})();
$(函数(){
demoMap={
initMap:function(){
var mylatng=newgoogle.maps.LatLng(41.097905,-73.405006);
变量myOptions={
缩放:16,
中心:myLatlng,
mapTypeId:google.maps.mapTypeId.ROADMAP
}
this.map=new google.maps.map(document.getElementById(“map_canvas”),myOptions);
这个.addMarker();
},
addMarker:函数(){
var self=这个;
var contentString=“”;
contentString+=“弗罗斯蒂先生的熟食和烧烤店”;
contentString+=“10第一街Norwalk,CT 06855(203)956-5767”;
var latlng=this.map.getCenter();
var marker=new google.maps.marker({
位置:latlng,
map:this.map,
标题:“Frosty先生的熟食和烧烤店”
});
var infowindow=new google.maps.infowindow({
content:contentString,
真的吗
});
google.maps.event.addListener(标记'mouseover',函数(){
setOptions({pixelOffset:self.getInfowindowOffset(self.map,marker)});
打开(self.map,marker);
});
google.maps.event.addListener(标记'mouseout',函数(){
infowindow.close();
});
},
getInfowindowOffset:函数(映射、标记){
var center=this.getPixelFromLatLng(map.getCenter()),
point=this.getPixelFromLatLng(marker.getPosition()),
象限=”,
抵消;
象限+=(点y>中心y)?“b”:“t”;
象限+=(x点<中心x)?“l”:“r”;
如果(象限==“tr”){
offset=新的google.maps.Size(-70185);
}否则如果(象限=“tl”){
offset=新的google.maps.Size(70185);
}else if(象限==“br”){
offset=新的google.maps.Size(-70,20);
}否则如果(象限=“bl”){
offset=新的google.maps.Size(70,20);
}
返回偏移量;
},
getPixelFromLatLng:函数(latLng){
var projection=this.map.getProjection();
var点=从LATLNGTOPOINT(latLng)的投影;
返回点;
}
}
initMap();
})();
如果在正文中添加一些高度(例如2000px)并从页面顶部滚动一点,然后单击关闭的信息窗口,它将按信息窗口的确切高度跳转页面。我认为这与这样一个事实有关:当您关闭元素时,Google会完全从DOM中删除它们,而不是简单地使用CSS类来显示/取消显示窗口
我在互联网上搜寻答案,但似乎没有人注意到,也没有人关心,因为这是一个小问题。我能想到的唯一解决方案是用window.scrollTo以InfoWindow的高度反方向改变滚动(我无法让实际的InfoWindow元素节点测量它当前的离地高度,所以我不得不强制所有InfoWindow都有一个特定的高度,以便在我的JS中设置相同的高度).这只虫子快把我逼疯了,我很高兴我不是一个人:)
这并不是非常优雅,但我注意到当我手动触发
infowindow.close()
时,它并没有发生,只是在我实际单击默认的关闭按钮时。所以最后,我隐藏了关闭按钮,添加了我自己的带有infowindow.setContent()
,并用它来关闭infowindow。嘿,罗西,很高兴在这里看到答案。:)你的方法肯定比我的解决方法好。因此,如果我能让它发挥作用,我可能会把它作为正确的答案。如何从Javascript中选择自定义信息窗口元素以使用infowindow.close()
?据我所知,GoogleMaps中的InfoWindow对象并不公开节点本身,而且由于元素在打开它们之前实际上不在DOM中,因此无法准确地选择它们。您是否在自定义元素上使用了直接onclick属性?好的,不用担心。我让它使用一个小的setTimeout,等待Google创建窗口。它不是很干净,但很管用您也可以简单地添加overflow-anchor:none根据这里指出的解决方法,将代码>添加到地图的div元素:这是一个很好的解决方法,但IE不支持它。是的,你有道理。但是这个问题在IE中不存在/不可复制(或者至少在版本11中,我已经测试过了)。Hi@leonheess,我发布这个问题已经有一段时间了,但是你提供的链接似乎与这个问题不同。这个问题与InfoWindow的关闭有关,而不是在它打开时。我猜谷歌地图有很多不受欢迎的行为嗨@GregGaede,你说得对。总有一天我会很有希望学会读过书名。我撤回了我的接近票——改为向上投一票。