2016-02-26 111 views
0

下面的代碼顯示了2個側邊欄。第一個側欄出現在您輸入地址時,並且是根據實際里程排序的標題,地址和獲取路線鏈接的列表。當您點擊其中一個獲取路線鏈接時,第一個側邊欄下方會出現帶有路線的第二個側欄。Google Maps API路線 - 在2個不同側邊欄之間交換

我想改變這個,所以當你點擊其中一個獲取路線的鏈接時,第一個邊欄會消失,只會提供第二個邊欄。還應該有一個X來點擊,它會將您帶回第一個邊欄,並將帶有方向的第二邊欄刪除。

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Google Maps JavaScript API v3 Example: Map Simple</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <style> 
     html, body, #map_canvas { 
     margin: 0; 
     padding: 0; 
     height: 100%; 
     } 
    </style> 

<style type='text/css'> 
.text 
{ 
width:300px; 
height:600px; 
background-color:white; 
overflow:scroll; 
overflow-x: hidden; 
} 
</style> 

<script src="https://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false"></script> 
<script type="text/javascript">  

// Store Name[0],Address[1],Coordinates[2],Icon[3] 

var locations = [ 
    ["John Doe", "145 Rock Ridge Road, Chester, NY ", "41.314926,-74.270134", "http://maps.google.com/mapfiles/ms/icons/blue.png"], 
    ["Jim Smith", "12 Williams Rd, Montvale, NJ ", "41.041599,-74.019554", "http://maps.google.com/mapfiles/ms/icons/green.png"], 
    ["John Jones", "689 Fern St Township of Washington, NJ ", "40.997704,-74.050598", "http://maps.google.com/mapfiles/ms/icons/yellow.png"], 

]; 
// alert(locations.length); 

var geocoder = null; 
var map = null; 
var customerMarker = null; 
var gmarkers = []; 
var closest = []; 
var directionsDisplay = new google.maps.DirectionsRenderer();; 
var directionsService = new google.maps.DirectionsService(); 
var map; 

function initialize() { 
// alert("init"); 
    geocoder = new google.maps.Geocoder(); 
    map = new google.maps.Map(document.getElementById('map'), 
     {  
      zoom: 9,  
      center: new google.maps.LatLng(52.6699927, -0.7274620),  
      mapTypeId: google.maps.MapTypeId.ROADMAP  
     });  
    var infowindow = new google.maps.InfoWindow();  
    var marker, i;  
    var bounds = new google.maps.LatLngBounds(); 
    document.getElementById('info').innerHTML = "found "+locations.length+" locations<br>"; 
    for (i = 0; i < locations.length; i++) {   
      var coordStr = locations[i][2]; 
     var coords = coordStr.split(","); 
     var pt = new google.maps.LatLng(parseFloat(coords[0]),parseFloat(coords[1])); 
      bounds.extend(pt); 
      marker = new google.maps.Marker({   
          position: pt,   
          map: map, 
       icon: locations[i][3], 
          address: locations[i][1], 
          title: locations[i][0], 
          html: locations[i][0]+"<br>"+locations[i][1]+"<br><br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;"+locations[i][1]+"&quot;);'>Get Directions</a>" 
          });        
      gmarkers.push(marker); 
      google.maps.event.addListener(marker, 'click', (function(marker, i) {   return function() 
      {   infowindow.setContent(marker.html); 
         infowindow.open(map, marker);   
      }  
     }) 
     (marker, i));  
    } 
    map.fitBounds(bounds); 

} 

     function codeAddress() { 
     var address = document.getElementById('address').value; 
     geocoder.geocode({ 'address': address}, function(results, status) { 
      if (status == google.maps.GeocoderStatus.OK) { 
      map.setCenter(results[0].geometry.location); 
     if (customerMarker) customerMarker.setMap(null); 
      customerMarker = new google.maps.Marker({ 
       map: map, 
       position: results[0].geometry.location 
      }); 
     closest = findClosestN(results[0].geometry.location,12); 
      // get driving distance 
      closest = closest.splice(0,12); 
      calculateDistances(results[0].geometry.location, closest,12); 
      } else { 
      alert('Geocode was not successful for the following reason: ' + status); 
      } 
     }); 
     } 

function findClosestN(pt,numberOfResults) { 
    var closest = []; 
    document.getElementById('info').innerHTML += "processing "+gmarkers.length+"<br>"; 
    for (var i=0; i<gmarkers.length;i++) { 
    gmarkers[i].distance = google.maps.geometry.spherical.computeDistanceBetween(pt,gmarkers[i].getPosition()); 
    document.getElementById('info').innerHTML += "process "+i+":"+gmarkers[i].getPosition().toUrlValue(6)+":"+gmarkers[i].distance.toFixed(2)+"<br>"; 
    gmarkers[i].setMap(null); 
    closest.push(gmarkers[i]); 
    closest.sort(sortByDist); 
    } 

    return closest; 
} 

function sortByDist(a,b) { 
return (a.distance- b.distance) 

} 

function calculateDistances(pt,closest,numberOfResults) { 
    var service = new google.maps.DistanceMatrixService(); 
    var request = { 
     origins: [pt], 
     destinations: [], 
     travelMode: google.maps.TravelMode.DRIVING, 
     unitSystem: google.maps.UnitSystem.IMPERIAL, 
     avoidHighways: false, 
     avoidTolls: false 
    }; 
    for (var i=0; i < closest.length; i++) { 
    request.destinations.push(closest[i].getPosition()); 
    } 
    service.getDistanceMatrix(request, function (response, status) { 
    if (status != google.maps.DistanceMatrixStatus.OK) { 
     alert('Error was: ' + status); 
    } else { 
     var origins = response.originAddresses; 
     var destinations = response.destinationAddresses; 
     var outputDiv = document.getElementById('side_bar'); 
     outputDiv.innerHTML = ''; 

    var results = response.rows[0].elements; 
     // save title and address in record for sorting 
     for (var i = 0; i < closest.length; i++) { 
     results[i].title = closest[i].title; 
     results[i].address = closest[i].address; 
     results[i].idx_closestMark = i; 
     } 
     results.sort(sortByDistDM); 
     for (var i = 0; 
     ((i < numberOfResults) && (i < closest.length)); i++) { 
     closest[i].setMap(map); 

     outputDiv.innerHTML += "<a href='javascript:google.maps.event.trigger(closest[" + results[i].idx_closestMark + "],\"click\");'>" + results[i].title + '</a><br>' + results[i].address + "<br>" + results[i].distance.text + ' approximately ' + results[i].duration.text + "<br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;" + results[i].address + "&quot;);'>Get Directions</a><br><hr>" 

     } 
    } 
    }); 
} 

function getDirections(origin, destination) { 
    var request = { 
     origin:origin, 
     destination:destination, 
     travelMode: google.maps.DirectionsTravelMode.DRIVING 
    }; 
    directionsService.route(request, function(response, status) { 
    if (status == google.maps.DirectionsStatus.OK) { 
     directionsDisplay.setMap(map); 
     directionsDisplay.setDirections(response); 
     directionsDisplay.setPanel(document.getElementById('side_bar')); 
    } 
    }); 
} 

function sortByDistDM(a, b) { 
    return (a.distance.value - b.distance.value) 
} 

google.maps.event.addDomListener(window, 'load', initialize); 
</script> 
    </head> 
    <body> 
    <table border="0"><tr><td> 
    <div id="map" style="height: 600px; width:800px;"></div> 
    </td><td> 
    <div id="side_bar" class = 'text'> </div> 
    </td></tr></table> 

<input id="address" type="text" value="Palo Alto, CA"></input> 
<input type="button" value="Search" onclick="codeAddress();"></input> 
<div id="info"></div> 

    </body> 
</html> 

這似乎是代碼帶來了第一個欄

var outputDiv = document.getElementById('side_bar'); 

這似乎是代碼,彈出第二欄。

directionsDisplay.setPanel(document.getElementById('side_bar')); 

我不知道如何去做這件事是在換側邊欄或替換它們,但找不到任何有用的東西。任何人都可以告訴我如何做到這一點?

感謝,

回答

0
    你可能想作出的指示面板的新元素
  1. ,然後移動在側邊欄
  2. 創建一個「X」將其關閉。 (我把一個從這樣一個問題:X close button only using css

路面板CSS:

#panel { 
    z-index: -100; 
    display: block; 
    position: absolute; 
    top: 25px; 
    left: 400px; 
} 

CSS的side_bar:

#side_bar { 
    z-index: 100; 
    position: absolute; 
    top: 0px; 
    left: 400px; 
} 

proof of concept fiddle

代碼片段:

var locations = [ 
 
    ["John Doe", "145 Rock Ridge Road, Chester, NY ", "41.314926,-74.270134", "http://maps.google.com/mapfiles/ms/icons/blue.png"], 
 
    ["Jim Smith", "12 Williams Rd, Montvale, NJ ", "41.041599,-74.019554", "http://maps.google.com/mapfiles/ms/icons/green.png"], 
 
    ["John Jones", "689 Fern St Township of Washington, NJ ", "40.997704,-74.050598", "http://maps.google.com/mapfiles/ms/icons/yellow.png"], 
 

 
]; 
 
// alert(locations.length); 
 

 
var geocoder = null; 
 
var map = null; 
 
var customerMarker = null; 
 
var gmarkers = []; 
 
var closest = []; 
 
var directionsDisplay = new google.maps.DirectionsRenderer();; 
 
var directionsService = new google.maps.DirectionsService(); 
 
var map; 
 

 
function initialize() { 
 
    // alert("init"); 
 
    geocoder = new google.maps.Geocoder(); 
 
    map = new google.maps.Map(document.getElementById('map'), { 
 
    zoom: 9, 
 
    center: new google.maps.LatLng(52.6699927, -0.7274620), 
 
    mapTypeId: google.maps.MapTypeId.ROADMAP 
 
    }); 
 
    var infowindow = new google.maps.InfoWindow(); 
 
    var marker, i; 
 
    var bounds = new google.maps.LatLngBounds(); 
 
    document.getElementById('info').innerHTML = "found " + locations.length + " locations<br>"; 
 
    for (i = 0; i < locations.length; i++) { 
 
    var coordStr = locations[i][2]; 
 
    var coords = coordStr.split(","); 
 
    var pt = new google.maps.LatLng(parseFloat(coords[0]), parseFloat(coords[1])); 
 
    bounds.extend(pt); 
 
    marker = new google.maps.Marker({ 
 
     position: pt, 
 
     map: map, 
 
     icon: locations[i][3], 
 
     address: locations[i][1], 
 
     title: locations[i][0], 
 
     html: locations[i][0] + "<br>" + locations[i][1] + "<br><br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;" + locations[i][1] + "&quot;);'>Get Directions</a>" 
 
    }); 
 
    gmarkers.push(marker); 
 
    google.maps.event.addListener(marker, 'click', (function(marker, i) { 
 
     return function() { 
 
      infowindow.setContent(marker.html); 
 
      infowindow.open(map, marker); 
 
     } 
 
     }) 
 
     (marker, i)); 
 
    } 
 
    map.fitBounds(bounds); 
 

 
    $("#mdiv").click(function() { 
 
    $("#side_bar").css({ 
 
     "z-index": 100, 
 
     "top": "0px" 
 
    }); 
 
    $("#panel").css("z-index", -100); 
 
    $("#mdiv").css("display", "none"); 
 
    }) 
 

 
} 
 

 
function codeAddress() { 
 
    var address = document.getElementById('address').value; 
 
    geocoder.geocode({ 
 
    'address': address 
 
    }, function(results, status) { 
 
    if (status == google.maps.GeocoderStatus.OK) { 
 
     map.setCenter(results[0].geometry.location); 
 
     if (customerMarker) customerMarker.setMap(null); 
 
     customerMarker = new google.maps.Marker({ 
 
     map: map, 
 
     position: results[0].geometry.location 
 
     }); 
 
     closest = findClosestN(results[0].geometry.location, 12); 
 
     // get driving distance 
 
     closest = closest.splice(0, 12); 
 
     calculateDistances(results[0].geometry.location, closest, 12); 
 
    } else { 
 
     alert('Geocode was not successful for the following reason: ' + status); 
 
    } 
 
    }); 
 
} 
 

 
function findClosestN(pt, numberOfResults) { 
 
    var closest = []; 
 
    document.getElementById('info').innerHTML += "processing " + gmarkers.length + "<br>"; 
 
    for (var i = 0; i < gmarkers.length; i++) { 
 
    gmarkers[i].distance = google.maps.geometry.spherical.computeDistanceBetween(pt, gmarkers[i].getPosition()); 
 
    document.getElementById('info').innerHTML += "process " + i + ":" + gmarkers[i].getPosition().toUrlValue(6) + ":" + gmarkers[i].distance.toFixed(2) + "<br>"; 
 
    gmarkers[i].setMap(null); 
 
    closest.push(gmarkers[i]); 
 
    closest.sort(sortByDist); 
 
    } 
 

 
    return closest; 
 
} 
 

 
function sortByDist(a, b) { 
 
    return (a.distance - b.distance) 
 

 
} 
 

 
function calculateDistances(pt, closest, numberOfResults) { 
 
    var service = new google.maps.DistanceMatrixService(); 
 
    var request = { 
 
    origins: [pt], 
 
    destinations: [], 
 
    travelMode: google.maps.TravelMode.DRIVING, 
 
    unitSystem: google.maps.UnitSystem.IMPERIAL, 
 
    avoidHighways: false, 
 
    avoidTolls: false 
 
    }; 
 
    for (var i = 0; i < closest.length; i++) { 
 
    request.destinations.push(closest[i].getPosition()); 
 
    } 
 
    service.getDistanceMatrix(request, function(response, status) { 
 
    if (status != google.maps.DistanceMatrixStatus.OK) { 
 
     alert('Error was: ' + status); 
 
    } else { 
 
     var origins = response.originAddresses; 
 
     var destinations = response.destinationAddresses; 
 
     var outputDiv = document.getElementById('side_bar'); 
 
     outputDiv.innerHTML = ''; 
 

 
     var results = response.rows[0].elements; 
 
     // save title and address in record for sorting 
 
     for (var i = 0; i < closest.length; i++) { 
 
     results[i].title = closest[i].title; 
 
     results[i].address = closest[i].address; 
 
     results[i].idx_closestMark = i; 
 
     } 
 
     results.sort(sortByDistDM); 
 
     for (var i = 0; 
 
     ((i < numberOfResults) && (i < closest.length)); i++) { 
 
     closest[i].setMap(map); 
 

 
     outputDiv.innerHTML += "<a href='javascript:google.maps.event.trigger(closest[" + results[i].idx_closestMark + "],\"click\");'>" + results[i].title + '</a><br>' + results[i].address + "<br>" + results[i].distance.text + ' approximately ' + results[i].duration.text + "<br><a href='javascript:getDirections(customerMarker.getPosition(),&quot;" + results[i].address + "&quot;);'>Get Directions</a><br><hr>" 
 

 
     } 
 
    } 
 
    }); 
 
} 
 

 
function getDirections(origin, destination) { 
 
    var request = { 
 
    origin: origin, 
 
    destination: destination, 
 
    travelMode: google.maps.DirectionsTravelMode.DRIVING 
 
    }; 
 
    directionsService.route(request, function(response, status) { 
 
    if (status == google.maps.DirectionsStatus.OK) { 
 
     directionsDisplay.setMap(map); 
 
     directionsDisplay.setDirections(response); 
 
     $("#side_bar").css({ 
 
     "z-index": -100, 
 
     "top": "25px" 
 
     }); 
 
     $("#panel").css("z-index", 100); 
 
     $("#mdiv").css("display", "block"); 
 

 
     directionsDisplay.setPanel(document.getElementById('panel')); 
 

 

 
    } 
 
    }); 
 
} 
 

 
function sortByDistDM(a, b) { 
 
    return (a.distance.value - b.distance.value) 
 
} 
 

 
google.maps.event.addDomListener(window, 'load', initialize);
html, 
 
body, 
 
#map_canvas { 
 
    margin: 0; 
 
    padding: 0; 
 
    height: 100%; 
 
} 
 
table, 
 
tr, 
 
td { 
 
    height: 100%; 
 
} 
 
.text { 
 
    width: 300px; 
 
    height: 600px; 
 
    background-color: white; 
 
    overflow: scroll; 
 
    overflow-x: hidden; 
 
} 
 
#side_bar { 
 
    z-index: 100; 
 
    position: absolute; 
 
    top: 0px; 
 
    left: 400px; 
 
} 
 
#panel { 
 
    z-index: -100; 
 
    display: block; 
 
    position: absolute; 
 
    top: 25px; 
 
    left: 400px; 
 
} 
 
#mdiv { 
 
    z-index: 500; 
 
    width: 25px; 
 
    height: 25px; 
 
    display: none; 
 
    background-color: red; 
 
    border: 1px solid black; 
 
    position: absolute; 
 
    left: 400px; 
 
    top: 0px; 
 
} 
 
.mdiv { 
 
    height: 25px; 
 
    width: 2px; 
 
    margin-left: 12px; 
 
    background-color: black; 
 
    transform: rotate(45deg); 
 
    -ms-transform: rotate(45deg); 
 
    /* IE 9 */ 
 
    -webkit-transform: rotate(45deg); 
 
    /* Safari and Chrome */ 
 
    z-index: 1; 
 
} 
 
.md { 
 
    height: 25px; 
 
    width: 2px; 
 
    background-color: black; 
 
    transform: rotate(90deg); 
 
    -ms-transform: rotate(90deg); 
 
    /* IE 9 */ 
 
    -webkit-transform: rotate(90deg); 
 
    /* Safari and Chrome */ 
 
    z-index: 2; 
 
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=geometry"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table border="0"> 
 
    <tr> 
 
    <td> 
 
     <div id="map" style="height: 100%; width:400px;"></div> 
 
    </td> 
 
    <td> 
 
     <div id="side_bar" class='text'></div> 
 
     <div id="panel" class='text'></div> 
 
    </td> 
 
    </tr> 
 
</table> 
 

 
<input id="address" type="text" value="Paramus, NJ" /> 
 
<input type="button" value="Search" onclick="codeAddress();" /> 
 
<div id="info"></div> 
 
<div id="mdiv"> 
 
    <div class="mdiv"> 
 
    <div class="md"> 
 
    </div> 
 
    </div> 
 
</div>

+0

工程了不起與1周次要的例外。當你點擊X來恢復到第一個滾動條時,它仍然會在底部留下一點點的方向。我無法修復它,讓1個滾動條完全覆蓋另一個滾動條,只有1個滾動條可見。非常感謝!! –

+0

這只是一個概念的證明,那就是CSS。您需要爲您調整實際佈局。 – geocodezip