我们有一个带标记的标准地图(MapTypeId.ROADMAP)。地图上方是一个显示“Show StreetView”的按钮。如果用户点击它,它会在标记的位置加载StreetView(在同一个div中)。该按钮更改为“隐藏街景视图”,如果单击该按钮,地图将恢复为标准ROADMAP。用户也可以使用'pegman'来模拟相同的行为。
当标记位置没有实际的街景时,问题就开始了。我们使用事件监听器处理此事件,如果没有街景视图可用,则显示通知用户的消息,并返回false以防止“显示”不存在的街景。工作得很好,除非用户试图使用'pegman' - 因为我们已经加载(但没有显示)街景(不存在)。当用户第一次没有发生任何事情时,用户将街景小人放在地图上,但我们的“显示/隐藏按钮”发生了变化。在第二滴街头小人身上,它变成了街景,但是我们的“显示/隐藏按钮”现在已经不合适了(当它已经存在时显示'显示街景',并且在ROADMAP上显示'隐藏街景'。
我们尝试更改我们的代码结构 - streetview(var panorama = ...)仅通过'onclick'javascript函数初始化(它最初与'loadMap'函数捆绑在一起,现在已经分离到另一个函数)在我们的显示/隐藏按钮上 - 如果街景可用,对其进行了很大的更改并更改了按钮,如果没有返回false并向用户显示消息。这很好用,但现在如果用户使用'pegman'进入街景,按钮不会改变,因为它已被分隔成另一个功能。
我正处于最后阶段,三天尝试各种选项,我无法弄清楚如何在'loadMap'功能中通过pegman drop 来改变街景视图 (请参阅下面的loadMap代码中的'visible_changed'事件监听器) - 如果我能解决这个问题,我可以更改按钮显示,但对于我的生活,我无法弄清楚(调查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函数,它通过地图上方的Show / Hide Streetview按钮上的'onclick'动作调用(不是我认为你需要这个,它对这个用例来说一切正常,它是该死的pegman掉落不起作用,但你永远不知道...)
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');
});
}
答案 0 :(得分:2)
'visible_changed'的事件监听器位于地图对象上,而不是全景图上。 Map对象(v3)没有'visible_changed'事件。
我的解决方案(对我有用......)是:
var pano = null ; // on initialize I use this in the global scope, bad, I know... <br>
var map = null ; // likewise <br>
function init(); <br>
map = new google.maps.Map(document.getElementById('map'),
MapOptions ); <br>
createPano() ; <br>
... other init stuff here .. <br>
}
function createPano() { <br>
if ( pano == null ) { <br>
pano = map.getStreetView(); // the api says this creates the default pano object..
<br> }
google.maps.event.addListener(pano, "visible_changed",
function(){ <br>
alert("position is " + pano.getPosition() ) ; <br>
// change this to getPanoAndSwitch() when custom panos are available ..
<br> panoFlag = pano.getVisible();
...
rest of code here.
最不重要的是,这就是我的样子。