我试图在Google地图V3标记上的事件侦听器和地图边栏条目之间添加双向绑定。我寻找能够实现这一目标的例子,但在找到最佳实践方面遇到困难。在Google Maps API V3发布后,ESA 2009能够在边栏条目和标记之间建立此类关联。有没有现成的方法来完成这一点,可能与jQuery.Callbacks()?这个已经使用了3年,但很少有(如果有的话)成功的模拟实现能够干净地复制标记和相应的非Map侧栏条目之间的ESA 2009优雅的双向绑定功能。 This PlugIn是一个很好的开始,但是当直接点击标记时,JQuery缺乏突出显示或识别所选侧边栏项目的能力。将Google地图标记绑定到非地图边栏条目
ESA 2009方法在SidebarItem()和makeMarker()JS函数中使用内部函数,闭包和原型来建立边栏条目和标记之间的双向绑定。单击标记时,侧栏条目将突出显示(反之亦然),而不会出现明显的内存泄漏或过度递归。 ESA 2009技术在概念上难以掌握或扩展。这种行为是有用的,但没有被广泛采用。当用户点击侧边栏项目时,会出现典型的Google地图行为:地图平铺和infowindow会打开。这是标准的,但在ESA 2009版本中还有一个额外的部分,它是非地图侧边栏项目,通过CSS和焦点进行聆听和响应,然后进行相应的标记点击。这种双向侦听器效果很难通过JQuery进行移植,或者只是将其本地合并到任何最近的商店定位器解决方案中。所希望的功能是:
当用户点击标记或它的侧边栏条目,现有亮点被清除和所选择的信息窗口打开并且相应的侧边栏 项被并行识别...,反之亦然。
实现此有用效果的最佳做法是什么?有谁知道当前整合双向触发器的例子吗?在Google服务器和相应事件侦听器呈现的特定标记之间,如何在同一页面上但在地图之外实现最佳链接(例如侧边栏项目)。我们是否应该使用JQuery最新的(1.7)回调处理特性?有更好的非JQuery技巧吗?
下面是在一个名为'map'的Map()上创建Marker和InfoWindow并在名为'sidebar'的DIV中创建一个侧栏行的“最先进的”熟悉的片段,其中markerArray和markerBounds收集标记。该SidebarItem()构造函数是由makeMarker()函数从欧洲航天局2009年的优秀例子叫做:
var infoWindow = new google.maps.InfoWindow();
var markerBounds = new google.maps.LatLngBounds();
var markerArray = [];
function makeMarker(options){
var pushPin = new google.maps.Marker({map:map});
pushPin.setOptions(options);
google.maps.event.addListener(pushPin, "click", function(){
infoWindow.setOptions(options);
infoWindow.open(map, pushPin);
if(this.sidebarButton)this.sidebarButton.button.focus();
});
var idleIcon = pushPin.getIcon();
if(options.sidebarItem){
pushPin.sidebarButton = new SidebarItem(pushPin, options);
pushPin.sidebarButton.addIn("sidebar");
}
markerBounds.extend(options.position);
markerArray.push(pushPin);
return pushPin;
}
google.maps.event.addListener(map, "click", function(){
infoWindow.close();
});
function SidebarItem(marker, opts){
var tag = opts.sidebarItemType || "button";
var row = document.createElement(tag);
row.innerHTML = opts.sidebarItem;
row.className = opts.sidebarItemClassName || "sidebar_item";
row.style.display = "block";
row.style.width = opts.sidebarItemWidth || "120px";
row.onclick = function(){
google.maps.event.trigger(marker, 'click');
}
row.onmouseover = function(){
google.maps.event.trigger(marker, 'mouseover');
}
row.onmouseout = function(){
google.maps.event.trigger(marker, 'mouseout');
}
this.button = row;
}
// adds a sidebar item to a
SidebarItem.prototype.addIn = function(block){
if(block && block.nodeType == 1)this.div = block;
else
this.div = document.getElementById(block)
|| document.getElementById("sidebar")
|| document.getElementsByTagName("body")[0];
this.div.appendChild(this.button);
}
// deletes a sidebar item
SidebarItem.prototype.remove = function(){
if(!this.div) return false;
this.div.removeChild(this.button);
return true;
}
SidebarItem()和makeMarker()是公共领域的职能,但他们已经像我这样的新手了解顽固难,采纳和整合。任何意见或当前的例子将不胜感激。具体而言,ESA 2009方法是否过时?我没有找到这个策略的最近使用。什么是将非地图DOM元素与特定Google Map标记关联的最佳现代方式?
在此先感谢...
谢谢。欣赏范围提示,但不认为这是困难。将检查.triggerHandler方法。您是否知道任何主要商店定位器上的双触发示例实现? – BogieCoder
@BogieCoder,请参阅我的编辑,了解具有类似目标的代码示例。 –
谢谢@甜菜根 - 甜菜根。将研究该解决方案,这是我正在寻找的策略类型。 – BogieCoder