谷歌地图标记数据

3

我目前正在向服务器发出ajax调用,以获取要在谷歌地图上显示的经纬度列表。同时,我也为每个标记附加了一个“点击”事件。关键是我需要能够将一些额外的数据存储到标记中,以便稍后将其与数据库匹配。我使用Title属性来显示一些友好的信息。 AJAX、标记创建和点击事件都运行良好。存储标记的额外数据的正确方法是什么?请参见此处的代码:

$.ajax({
    url: "/location/NearbyHotspots",
    data: {
        lat: marker.position.lat(),
        lng: marker.position.lng(),
        radius: 10
    },
    datatype: "json",
    type: "POST",
    success: function (data, status, xhttp) {
        for (var i = 0; i < data.length; i++) {
            var loc = new google.maps.LatLng(data[i].Lat, data[i].Long);
            var newmarker = new google.maps.Marker({
                position: loc,
                draggable: false,
                map: map,
                title: data[i].Name
            });

            // This doesn't seem to work
            newmarker.hotspotid = data[i].ID;
            google.maps.event.addListener(newmarker, "click", function(mark) {
                alert(mark.hotspotid);
            });
        }
    },
    error: function (jqXHR, textStatus, errorThrown) {
        alert(textStatus);
    }
});
2个回答

11

哈!我搞定了。是“this”的问题!

google.maps.event.addListener(newmarker, "click", function(mark) {
    alert(this.hotspotid);
});  

8

我认为你的方法是正确的,只是事件处理程序不正确。在你的处理程序中:

function(mark) {
    alert(mark.hotspotid);
}

mark参数不是您期望的标记,而是一个 MouseEvent有关详细信息,请参阅 API 参考文档)。

为了修复这个问题,您需要使用闭包来传递对标记的引用。这个循环使得这种情况变得复杂 - 您不能只是使用对 newmarker 的引用,因为它将始终只引用循环中的最后一个标记。有几种不同的方法可以解决这个问题,但最简单的方法是在单独的函数中附加点击事件:

success: function (data, status, xhttp) {
    // define a function to attach the click event
    function attachClickEvent(marker) {
        google.maps.event.addListener(marker, "click", function() {
            // the reference to the marker will be saved in the closure
            alert(marker.hotspotid);
        });
    }
    for (var i = 0; i < data.length; i++) {
        var loc = new google.maps.LatLng(data[i].Lat, data[i].Long);
        var newmarker = new google.maps.Marker({
            position: loc,
            draggable: false,
            map: map,
            title: data[i].Name
        });

        newmarker.hotspotid = data[i].ID;
        attachClickEvent(newmarker);
    }
},

顺便提一句,在这种情况下,不再需要使用自定义数据扩展标记对象,您可以向attachClickEvent函数传递第二个参数以及data[i].ID的数据。 - Danny C
这应该是被接受的答案。它提供了一种干净的方法来完成它,不像OP自己的答案建议那样留下未使用的处理程序参数。 - tfrascaroli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接