我们有一个标准地图(MapTypeId.ROADMAP),上面有一个标记。地图上方是一个按钮,上面写着“显示街景”。如果用户点击它,它会在标记的位置(在同一个 div 中)加载 StreetView。该按钮更改为“隐藏街景”,如果单击,地图将恢复为标准 ROADMAP。用户也可以明显地使用“街景小人”来模拟相同的行为。
当标记的位置没有可用的实际街景时,问题就开始了。我们使用事件侦听器处理此问题,如果没有可用的街景,则会显示一条消息通知用户,并返回 false 以防止“显示”不存在的街景。效果很好,除非用户尝试使用“街景小人”——因为我们已经加载(但未显示)街景(不存在)。当用户第一次将街景小人放在地图上时,什么都没有发生,但是我们的“显示/隐藏按钮”发生了变化。在街景小人的第二次下降时,它变成了街景,但我们的“显示/隐藏按钮”现在不合适了(它在已经存在时显示“显示街景”,而在 ROADMAP 上显示“隐藏街景”。
我们尝试改变我们的代码结构——街景(var 全景= ...)仅通过我们的“onclick”javascript函数初始化(它最初与“loadMap”函数捆绑在一起,现在它已被分离到另一个函数)显示/隐藏按钮 - 如果街景可用,对其进行重大更改并更改按钮,如果不返回 false 并向用户显示消息。这很好用,但现在如果用户使用“街景小人”去街景,按钮不会改变,因为它已被分离到另一个功能中。
我已经精疲力尽了,尝试了各种选项的三天,但我无法弄清楚如何在“loadMap”函数中收听“通过街景小人掉落改变街景”(参见“visible_changed”事件监听器中的loadMap 下面的代码) - 如果我能弄清楚,我可以更改按钮显示,但对于我的生活,我无法弄清楚(调查 DOM 突变以监听街景的显示,但不是非常“跨浏览器友好”,即很重要,因为该网站每月的点击量超过 400 万次)。
这是'loadMap'函数
function loadGMap(lat, lng, nachladenAnzeigen, radialConflict){
// Create the Map variables
mapDiv = document.getElementById('map');
width = parseInt(mapDiv.style.width);
height = parseInt(mapDiv.style.height);
latlng = new google.maps.LatLng(lat, lng);
// Create Map
var mapOptions = {
zoom: 14,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP,
scrollwheel: false,
panControl: false
};
map = new google.maps.Map(mapDiv,mapOptions);
... Code here for laying marker to map...
google.maps.event.addListener(map, 'visible_changed', function(){
alert('please work');
// It doesn't - no alert when pegman is dropped :-(
}
// Check for a street view at the marker position
var streetViewCheck = new google.maps.StreetViewService();
streetViewCheck.getPanoramaByLocation(latlng, 50, function(result, status) {
if (status == google.maps.StreetViewStatus.ZERO_RESULTS) {
streetViewAvailable = 0;
}else{
streetViewAvailable = 1;
}
});
... more code (event listeners, ie, zoom changed, etc...
这是 loadStreetView 函数,它通过地图上方“显示/隐藏街景”按钮上的“onclick”操作调用(不是我认为你需要这个,对于这个用例来说一切正常,它是该死的街景小人下降这不起作用,但你永远不知道......)
function loadStreetView(){
// Make 'Show/Hide StreetView' links above the map work
// Handle the toggle of StreetView 'button' display
if(streetViewAvailable == 0){
noStreetViewVariable = document.getElementById('noStreetView');
noStreetViewVariable.style.display = "inline";
return false;
}else{
panorama = map.getStreetView();
panorama.setPosition(latlng);
panorama.setPov({
heading: 265,
zoom:1,
pitch:0
});
var toggle = panorama.getVisible();
if (toggle == false) {
panorama.setVisible(true);
$('#button_streetview').attr("src", 'img/buttons/mapview.png');
} else {
panorama.setVisible(false);
$('#button_streetview').attr("src", 'img/buttons/streetview.png');
}
}
google.maps.event.addListener(panorama, 'visible_changed', function(){
if(streetViewAvailable == 0){
$('#button_streetview').attr("src", 'img/buttons/mapview.png');
}
else if(streetViewAvailable == 1){
if (panorama.getVisible() == true ) {
$('#button_streetview').attr("src", 'img/buttons/mapview.png');
}
}
});
google.maps.event.addListener(panorama, 'closeclick', function() {
$('#button_streetview').attr("src", 'img/buttons/streetview.png');
});
}