Javascript 谷歌地图API v3-为什么没有事件上下文?
第一次使用GoogleMapsAPIv3,我得到了一个带有大量标记的地图。我希望这样,当您单击一个时,将显示一个特定的信息窗口(特定于您单击的标记)。我真的很惊讶点击事件没有告诉你点击的实际标记 我知道有一个解决方案使用一个单独的方法来创建一个闭包,但这对我来说似乎是一个黑客。有更好的方法吗?或者,是否有方法询问映射“此位置存在哪些标记”并从事件参数传入该位置 我希望事件能像这样进行:Javascript 谷歌地图API v3-为什么没有事件上下文?,javascript,events,google-maps-api-3,Javascript,Events,Google Maps Api 3,第一次使用GoogleMapsAPIv3,我得到了一个带有大量标记的地图。我希望这样,当您单击一个时,将显示一个特定的信息窗口(特定于您单击的标记)。我真的很惊讶点击事件没有告诉你点击的实际标记 我知道有一个解决方案使用一个单独的方法来创建一个闭包,但这对我来说似乎是一个黑客。有更好的方法吗?或者,是否有方法询问映射“此位置存在哪些标记”并从事件参数传入该位置 我希望事件能像这样进行: google.maps.event.addListener(marker, 'click', function
google.maps.event.addListener(marker, 'click', function(event, obj)
{
//Now I can work with "obj" - the thing that was clicked.
});
function createMarker (point, map)
{
var marker = new google.maps.Marker({
position: point,
map: map,
title: "blah"});
marker.stuffOnTheMarker = "Some interesting stuff";
var content = buildSomeContentForThisMarker ();
google.maps.event.addListener(marker, 'click', function() {
infowindow.close ();
infowindow.setContent(content);
infowindow.open(map,marker);
// access the marker than caused this event
alert (marker.stuffOnTheMarker);
});
}
我认为根据单击事件的位置来查找标记对象是错误的。对我来说,使用闭包将事件与特定标记关联似乎是一个有效的解决方案。我将创建一个如下所示的函数:
google.maps.event.addListener(marker, 'click', function(event, obj)
{
//Now I can work with "obj" - the thing that was clicked.
});
function createMarker (point, map)
{
var marker = new google.maps.Marker({
position: point,
map: map,
title: "blah"});
marker.stuffOnTheMarker = "Some interesting stuff";
var content = buildSomeContentForThisMarker ();
google.maps.event.addListener(marker, 'click', function() {
infowindow.close ();
infowindow.setContent(content);
infowindow.open(map,marker);
// access the marker than caused this event
alert (marker.stuffOnTheMarker);
});
}
当API提供时,这是一种什么样的黑客行为?你所描述的是一个黑客。单击标记时,它将传递一个包含lat和lng的事件
google.maps.event.addListener(marker, 'click', function(e) {
console.log(e); // { x: 0, y: 0 }
});
您应该只在事件侦听器中引用“this”
google.maps.event.addListener(marker, 'click', function(e) {
// this == marker;
// e == MouseEvent
});
mapInst是google和yandex地图上的包装器。在callbacak中可以使用这种方式
//event drawing event
mousemoveDraw(event : any){
console.log('mousemoveDraw')
console.log(this)
console.log(this.stateDrawing)
try{
if (this.stateDrawing != 1){
console.log(this.stateDrawing)
let lat = event.latLng.lat();
let lng = event.latLng.lng();
console.log(lat,lng)
this.polyLine.pushCoord({ lat, lng });
}
}catch(e){
console.log('error Polyline.mousemoveDraw : ',e.message);
}
}
好吧,我想这似乎是唯一的办法,但感觉真的很脏。我想知道为什么他们没有实现他们的事件,所以你可以这样做:google.maps.event.addListener(marker,'click',function(event,obj){…}),其中“obj”是导致事件的原因。我猜是因为闭包给了你这个。您可以从单击事件回调访问标记。(更新答案)不,我所描述的根本不是黑客行为——看我更新的问题,也许我不清楚。谢谢你的意见。这就是我一直在寻找的,我考虑过,但没有尝试!谢谢。你能翻译一下那个评论吗?