简而言之,我试图完成的任务:
我尝试了很多,并且很难将处理程序附加到InfoWindow中的按钮上。我找到的最好的提示就是这个:Adding event to element inside Google Maps API InfoWindow
到目前为止我试过这个:
<script>
function initialize() {
var mapOptions = {
center: new google.maps.LatLng(50.903033, 11.359863),
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP,
disableDefaultUI: true,
zoomControl: true,
scaleControl: true,
overviewMapControl: true
};
var map = new google.maps.Map(document.getElementById('limousine-map'),
mapOptions);
var directionsService = new google.maps.DirectionsService();
var directionDisplay = new google.maps.DirectionsRenderer();
directionDisplay.setMap(map);
directionDisplay.setPanel(document.getElementById('route-details'));
var infoWindow = new google.maps.InfoWindow();
var endPoint = false;
var startPoint = false;
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(50.903033, 11.359863),
title: 'Test1'
});
marker.infoWindowContent = [
'<div id="infoWindow"><strong>Test</strong>',
'<button class="button" id="selectStart">Start</button>'+
'<button class="button" id="selectTarget" style="float: right;">Target</button></div>'
].join('<br>');
google.maps.event.addListener(marker,'click',function(){
infoWindow.close();
infoWindow = new google.maps.InfoWindow({
content: this.infoWindowContent
});
infoWindow.open(map,this);
clickedLocation = this;
google.maps.event.addListener(infoWindow, 'domready', function() {
$('#infoWindow button').on('click',function(){
console.log(clickedLocation);
if($(this).attr('id') == 'selectStart'){
startPoint = clickedLocation;
}
if($(this).attr('id') == 'selectTarget'){
endPoint = clickedLocation;
}
recalcRoute();
});
});
});
var marker2 = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(52.903033, 12.359863),
title: 'Test2'
});
marker2.infoWindowContent = [
'<div id="infoWindow"><strong>Test2</strong>',
'<button class="button" id="selectStart">Start</button>'+
'<button class="button" id="selectTarget" style="float: right;">Target</button></div>'
].join('<br>');
google.maps.event.addListener(marker2,'click',function(){
infoWindow.close();
infoWindow = new google.maps.InfoWindow({
content: this.infoWindowContent
});
infoWindow.open(map,this);
clickedLocation = this;
});
//Route painting
function recalcRoute(){
if(startPoint != false && endPoint != false){
var request = {
origin: startPoint,
destination: endPoint,
travelMode: google.maps.TravelMode.DRIVING,
unitSystem: google.maps.UnitSystem.METRIC
};
directionsService.route(request, function(response, status){
if(status == google.maps.DirectionsStatus.OK){
$('#route-details').parent().fadeIn();
directionDisplay.setDirections(response);
}
});
}else{
directionDisplay.setDirections(null);
}
}
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>
我让处理程序正常工作,但是路由计算不起作用。我收到了像
这样的错误Uncaught Error: Invalid value for property <origin>: [object Object]
thrown at line: directionsService.route(request, function(response, status){
如何将事件绑定到InfoWindow内的按钮并仍调用recalcRoute?
我还尝试在按钮上设置onclick
,但是对recalcRoute的引用是未知的。
为什么$('#infoWindow button').on('click',function(){ console.log('test'); });
无效?
答案 0 :(得分:0)
路线服务的来源和目的地需要是google.maps.LatLng对象或字符串,可以将其地理编码为地址,而不是google.maps.Marker对象。可以使用以下命令检索标记的google.maps.LatLng:
marker.getPosition()。
答案 1 :(得分:0)
您应该能够建立contentWindow的HTML并单击一次操作,然后一遍又一遍地使用它们。
contentWindow中唯一需要更改的是标题,以反映点击标记的标题。
这样的事情应该这样做:
function initialize() {
var mapOptions = {
center: new google.maps.LatLng(50.903033, 11.359863),
zoom: 6,
mapTypeId: google.maps.MapTypeId.ROADMAP,
disableDefaultUI: true,
zoomControl: true,
scaleControl: true,
overviewMapControl: true
};
var map = new google.maps.Map(document.getElementById('limousine-map'), mapOptions);
var directionsService = new google.maps.DirectionsService();
var directionDisplay = new google.maps.DirectionsRenderer();
directionDisplay.setMap(map);
directionDisplay.setPanel(document.getElementById('route-details'));
var Route = {
var request = {
origin: null,
destination: null,
travelMode: google.maps.TravelMode.DRIVING,
unitSystem: google.maps.UnitSystem.METRIC
};
this.setOrigin = function(m) { request.origin = m.getPosition(); };
this.setDestination = function(m) { request.destination = m.getPosition(); };
this.calc = function() {
if(request.origin && request.destination) {
directionsService.route(request, function(response, status) {
if(status == google.maps.DirectionsStatus.OK) {
$('#route-details').parent().fadeIn();
directionDisplay.setDirections(response);
}
});
} else {
directionDisplay.setDirections(null);
}
}
};
var route = new Route();
var clickedLocation;
var $infoWindowContent = $([
'<div class="infoWindowContent">',
'<h3></h3>',
'<button class="setOrigin">Start</button>',
'<button class="setDestination" style="float: right;">Target</button>',
'</div>'
].join(''));
$infoWindowContent.find(".setOrigin").on('click', function() {
route.setOrigin(clickedLocation);
route.calc();
});
$infoWindowContent.find(".setDestination").on('click', function() {
route.setDestination(clickedLocation);
route.calc();
});
var infoWindow = new google.maps.InfoWindow();
infoWindow.setContent($infoWindowContent.get(0));
//Assuming array markerData to contain the data necessary for bujilding markers ...
$.each(markerData, function(i, m) {
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(m.lat, m.lng),
title: m.title
});
google.maps.event.addListener(marker, 'click', function() {
clickedLocation = this;
infoWindow.close();//necessary?
$infoWindowContent.find("h3").text(this.getTitle());
infoWindow.open(map, this);
});
});
}
google.maps.event.addDomListener(window, 'load', initialize);
未测试
注意:
Route()
构造函数中包含了与路径有关的所有内容,只有一个实例route
。markerData
数组中,该数组循环可以根据需要创建尽可能多的标记。