2011-05-09 16 views
1

我們有一個帶有標記的標準貼圖(MapTypeId.ROADMAP)。地圖上方是一個按鈕,顯示「顯示StreetView」。如果用戶點擊它,它會在標記的位置(在同一個div中)加載StreetView。該按鈕更改爲「隱藏街景視圖」,如果點擊,地圖將恢復爲標準ROADMAP。用戶也可以使用「pegman」來模擬相同的bahviour。Google MapsV3 StreetView問題 - 如果無法使用街景,則無法使用

問題出現在標記位置沒有可用的實際街景。我們使用事件監聽器處理此事件,如果沒有街景可用,則會顯示一條消息通知用戶,並返回false以防止「顯示」不存在的街景。工作很好,除非用戶試圖使用'pegman' - 因爲我們已經加載(但不顯示)街景(不在此處)。當用戶第一次放下地圖時,什麼都沒有發生,但我們的'顯示/隱藏按鈕'改變了。在第二滴pegman它改變了街景,但是我們的「顯示/隱藏按鈕」現在已經不起眼了(它已經在那裏顯示'show street view',並且在ROADMAP上顯示'隱藏街景'

我們嘗試更改我們的代碼結構 - streetview(var panorama = ...)僅通過'onclick'javascript函數初始化(它最初與'loadMap'函數捆綁在一起,現在它已與另一個函數分離)我們的顯示/隱藏按鈕 - 如果街景可用,對其進行很大的改變並改變按鈕,如果不返回false並向用戶顯示消息,這很好,但是現在如果用戶使用'pegman'去街景按鈕,不改變,因爲它已經被分離到另一個功能

我在我的白堊結束,三天嘗試各種選項,我無法弄清楚如何在'loadMap'函數中偵聽'通過pegman丟棄'更改爲streetview'請參閱下的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... 

這是通過在顯示/隱藏街景按鈕地圖(不,我想你上面加入「onClick」行動稱爲loadStreetView功能會需要這個,這一切都爲這種使用情況做工精細,它不工作該死的衣夾下降,但你永遠不知道...)爲「visible_changed,用於」

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

感謝您發佈此問題,它幫助我修復了一個愚蠢的錯誤 – user609306 2014-11-06 07:48:18

回答

2

事件偵聽器是在地圖上對象,而不是全景。 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> } 

&nbsp;   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. 

Leastwise,這就是它看起來像我。