javascript - 将点击事件监听器添加到目录服务端点标记

标签 javascript google-maps google-maps-api-3

我希望能够从 window.google.maps.DirectionsService 调用中引用和/或附加点击事件监听器到 A 和 B 端点标记。

我知道你可以抑制这些标记并创建你自己的(所有与此相关的计算器都建议这样做。我不想要它),但是你失去了能够拖动标记并让它计算新路线的功能基于在您拖动端点的位置。

我想做的主要事情是覆盖默认信息窗口并显示我自己的自定义信息窗口。不过,第一步是能够连接到标记中。仅仅能够触发点击事件是不够的,我需要访问事件处理程序来覆盖。

这是一个可拖动标记的例子:http://jsbin.com/mekapadigo/1/edit?html,output

我不需要/不想要右边的面板,但我注意到有一个事件正在使用它监听 A 和 B 标记,所以建议也许这是可能的。

最佳答案

这是在端点上附加标记的版本,单击时会显示信息窗口。拖动标记时,标记位置和航路点会反馈到路线服务中。该请求已被限制,因此它不会超过每秒 10 次的查询限制。计算路线后,应将标记移回路线上(留作练习留给您)。

<!DOCTYPE html>
<html>
<head>
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
	<meta charset="utf-8">
	<title>Draggable directions</title>
	<style>
		html, body {
			height: 100%;
			margin: 0;
			padding: 0;
		}
		#map {
			height: 100%;
			width: 100%;
		}
	</style>
</head>
<body>
<div id="map"></div>
<script>
	function initMap() {

		var map = new google.maps.Map(document.getElementById('map'), {
			zoom: 10,
			center: {lat: 40.6, lng: -73.9}
		});

		var directionsService = new google.maps.DirectionsService;
		var directionsDisplay = new google.maps.DirectionsRenderer({
			draggable: true,
			map: map,
			suppressMarkers: true
		});

		var waypoints = [];
		var markerStart = new google.maps.Marker({
			position: {lat: 40.851246, lng: -73.875218},
			map: map,
			draggable:true
		});
		var infowindowStart = new google.maps.InfoWindow({
			content: "Marker Start Info Window"
		});
		markerStart.addListener('click', function() {
			infowindowStart.open(map, markerStart);
		});

		var markerEnd = new google.maps.Marker({
			position: {lat: 40.831916, lng: -73.888947},
			map: map,
			draggable:true
		});
		var infowindowEnd = new google.maps.InfoWindow({
			content: "Marker End Info Window"
		});
		markerEnd.addListener('click', function() {
			infowindowEnd.open(map, markerEnd);
		});


		var redisplay = _.throttle(function() {
			displayRoute(markerStart, markerEnd, directionsService, directionsDisplay, waypoints);
		}, 200);
		google.maps.event.addListener(markerStart, 'drag', redisplay);
		google.maps.event.addListener(markerEnd, 'drag', redisplay);

		directionsDisplay.addListener('directions_changed', function() {
			var directions = directionsDisplay.getDirections();
			waypoints = directions.request.waypoints;
		});

		displayRoute(markerStart, markerEnd, directionsService, directionsDisplay, waypoints);

	}

	function displayRoute(markerStart, markerEnd, service, display, waypoints) {
		service.route({
			origin: markerStart.getPosition(),
			destination: markerEnd.getPosition(),
			travelMode: google.maps.TravelMode.DRIVING,
			waypoints: waypoints,
			avoidTolls: true
		}, function(response, status) {
			if (status === google.maps.DirectionsStatus.OK) {
				waypoints = response.request.waypoints;
				display.setDirections(response);
			} else {
				console.log('Could not display directions due to: ' + status);
			}
		});
	}

</script>
<script src="https://maps.googleapis.com/maps/api/js?callback=initMap" async defer></script>
<script	src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.5.2/underscore-min.js"></script>
</body>
</html>

关于javascript - 将点击事件监听器添加到目录服务端点标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33816222/

相关文章:

javascript - python PIL _io.BytesIO 无法读取用 Canvas 转换的图像

google-maps - 如何从谷歌地图中的方向显示多条折线?

jquery - 如何使用文本-Google map 创建圆圈叠加

google-maps - Google Maps API 数据层功能。事件拖拽未触发

javascript - 使用 Json 向 Google map 添加标记 |应用程序接口(interface)

google-maps - Google map 无法在 https ://中工作

javascript - 当我点击div时如何获取它的值?

javascript - Odoo 11 Web JS 框架不会初始化我的模块,因此不会注册我的客户端操作

javascript - 使用 Javascript 确定文件是否存在(本地)

java - com.google.android.maps.MapView ClassNotFoundException