Google Maps JavaScript API v3:getDetails(请求,回调),用于多个位置
Google Maps JavaScript API v3: getDetails(request, callback) for multiple places
我已经实现了Google Maps JavaScript API v3,为我公司的网站设计了一个自定义商店定位器。让我首先说,我的代码适用于两个商店,但如果我再添加任何商店,这将是无效或可行的,因为用于使其工作的"黑客"代码。
我正在使用谷歌地图地点库,使用getDetails()
方法向谷歌发送"地点详细信息"请求。在回调中,我收到了我的每个店铺位置的InfoWindow
信息(名称、地址、位置)。
我为每个位置创建一个标记,然后使用google.maps.event.addListener
来协调place、marker和InfoWindow对象这就是我遇到问题的地方放置详细信息请求的接收顺序并不总是与发送顺序相同,这会导致对data-marker
属性分别设置为0和1以与地图标记相关的按钮进行索引。
是否要将第二个请求延迟到第一个请求完成?还是以保持顺序完整性的方式编写脚本
下面的第一段代码是我的事件处理程序,它使用标记的.place.placeId
属性将click
侦听器绑定到每个按钮,而不是使用markers
数组索引的首选技术(markers
数组保存两个存储的位置详细信息)。
Google Maps API文档(地方库)中的任何演示或示例都没有描述多个地方的过程。任何提示、资源或建议都将不胜感激
网址:http://m.alliancepointe.com/locate.html
事件处理程序
$(".loc-btn").on('click', function () {
var me = $(this).data('marker');
var place1 = markers[0].place.placeId;
var myIndex = me == place1 ? 0 : 1;
google.maps.event.trigger(markers[myIndex], 'click');
});
完整JS
var markers = [];
var map;
var infowindow;
var service;
function initialize() {
var index;
var daddr;
var idVA = 'ChIJKezXgqmxt4kRXrAnqIwIutA';
var geoVA = '38.80407,-77.062881/Alliance+Pointe,+LLC';
var idDC = 'ChIJDQlqOLG3t4kRqDU3uNoy4hs';
var geoDC = '38.90188,-77.049161/Alliance+Pointe,+LLC';
var bounds = new google.maps.LatLngBounds();
var mapOptions = {
center: {lat: 38.90188, lng: -77.049161},
zoom: 10,
mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}
};
map = new google.maps.Map(document.getElementById('map'),
mapOptions);
var request = [
{placeId: idVA, location: {lat: 38.80407, lng: -77.062881}},
{placeId: idDC, location: {lat: 38.90188, lng: -77.049161}}
];
var office = [
"Main Office",
"Principal Office"
];
infowindow = new google.maps.InfoWindow();
service = new google.maps.places.PlacesService(map);
for (var i = 0; i < request.length; i++) {
service.getDetails(request[i], function (placeResult, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
var id = placeResult.place_id;
var location = placeResult.geometry.location;
var trimAddr = placeResult.formatted_address.split(", ");
var image = {
url: 'images/icons/AP-marker_large.png',
scaledSize: new google.maps.Size(32, 54)
};
var marker = new google.maps.Marker({
map: map,
place: {
placeId: id,
location: location
},
icon: image,
title: "Get directions"
});
google.maps.event.addListener(marker, 'click', function () {
if (id == idVA) {
index = 0;
daddr = geoVA;
trimAddr[0] = "1940 Duke St #200";
} else {
index = 1;
daddr = geoDC;
trimAddr[0] = "2200 Pennsylvannia Ave NW";
}
infowindow.setContent('<div class="info-window title">' + placeResult.name + "</div><div class='info-window sub-title'>" + office[index] + '</div><div class="info-window">' + trimAddr[0] + '<br>' + trimAddr[1] + ", " + trimAddr[2] + '</div><div class="info-window direction-div"><div class="direction-icon"></div><a class="google-link save-button-link" target="_blank" href="https://www.google.com/maps/dir/Current+Location/' + daddr + '">Get Directions</a></div>');
infowindow.open(map, marker);
});
markers.push(marker);
//bounds.extend(location);
}
});
}
if (!bounds.isEmpty()) {
map.fitBounds(bounds);
}
$(".loc-btn").on('click', function () {
var me = $(this).data('marker');
var place1 = markers[0].place.placeId;
var myIndex = me == place1 ? 0 : 1;
google.maps.event.trigger(markers[myIndex], 'click');
//console.log("PlaceId = " + me);
//console.log("Adj index = " + myIndex);
//console.log("0:VA array index = " + markers[0].place.placeId);
//console.log("1:DC array index = " + markers[1].place.placeId);
});
google.maps.event.addListenerOnce(map, 'idle', function () {
$.mobile.loading("hide");
$(".loc-btn").prop("disabled",false);
});
}
google.maps.event.addDomListener(window, 'load', initialize);
HTML:Map&按钮
<div data-role="content" class="full-width">
<figure id="map"></figure>
<div class="loc-btn-set">
<button disabled data-role="none" data-theme="a" data-marker="ChIJKezXgqmxt4kRXrAnqIwIutA" class="loc-btn nightly-button">VA <span>- Alexandria</span></button>
<button disabled data-role="none" data-theme="b" data-marker="ChIJDQlqOLG3t4kRqDU3uNoy4hs" class="loc-btn nightly-button">DC <span>- Washington</span></button>
</div>
</div>
基于给定代码的最简单方法是在getDetails
-回调中添加按钮的点击处理程序。
在创建marker
:之后添加此项
$('.loc-btn[data-marker="'+id+'"]').click(function(){
google.maps.event.trigger(marker,'click');
});
- 用于回调的javascript参数
- 用于在ng映射中加载GeoJSON的回调
- 我的插件不适用于不同的回调
- Google Maps JavaScript API v3:getDetails(请求,回调),用于多个位置
- Javascript使用本地存储,回调对象并用Json更改为一个字符串以用于填充函数
- Angular,设置一个回调函数,用于在工厂和控制器之间更新
- 用于Javascript的Skydrive API中的回调URL
- Ajax成功回调仅适用于Chrome
- Javascript:setTimeout,用于循环和回调函数
- CollectionFS中是否存在用于文件下载的事件侦听器/回调
- 将 this 应用于 jQuery 回调
- 用于循环回调问题的 Nodej
- 主干.js路由器回调,用于在除 1 个特定 URL 段之外的所有 URL 段上触发
- .off 不适用于回调
- 用于从 GeoServer 检索图层名称的 AJAX 回调失败,并显示断言错误
- jQM 自动完成如何获取用于回调的值
- 如何进行仅将 jQuery 用于回调的老式 HTML 表单提交
- 为什么我在 JavaScript 中的回调不适用于异步结果
- blueimp jquery 文件上传 - “完成”、“完成”回调不适用于 IE 9
- 悬停在工具提示回调(用于Google地图)