【问题标题】:google maps multi marker info window not working谷歌地图多标记信息窗口不起作用
【发布时间】:2011-09-29 01:49:45
【问题描述】:

我在我的网页上使用 Google Maps API。我正在尝试使用信息窗口向页面添加多个标记。标记添加正常,但信息窗口都有最后一个标记的信息。有什么想法吗?

    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">

    <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <asp:ServiceReference Path="http://testserver/se1/WebServices/ShelterWebService.asmx" />
        </Services>
    </asp:ScriptManager>

                <asp:LinkButton ID="BtnHome" runat="server" onclick="BtnHome_Click">Home</asp:LinkButton>

<div id="map_canvas"></div>

<script type="text/javascript">
    var geocoder;
    var map;
    var addresses;

    function GetShelters() {
        ShelterExpress.WebServices.ShelterWebService.GetShelters('', OnGetSheltersComplete);
    }

    function OnGetSheltersComplete(retValue) {
        addresses = new Array();

        for (x in retValue) {
            addresses.push(retValue[x]["Address"]);
        }

        GenerateMap();
    }

    function GenerateMap() {
        /* Create the geocoder */
        geocoder = new google.maps.Geocoder();
        /* Some initial data for the map */
        mapOptions = {
            zoom: 10
        , center: new google.maps.LatLng(0, 0)
        , mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

        //var infowindow = new google.maps.InfoWindow();
        var marker, i;

        if (geocoder) {
             for (var item in addresses){
                geocoder.geocode({ 'address': addresses[item] }, function(results, status) {

                    if (status == google.maps.GeocoderStatus.OK) {
                        /* Position the map */
                        map.panTo(results[0].geometry.location);
                        /* Put a marker */
                        marker = new google.maps.Marker({
                            map: map,
                            position: results[0].geometry.location,
                            title: addresses[item]
                        });

                        var infowindow = new google.maps.InfoWindow({ content: addresses[item] });
                        infowindow.open(map, marker);

                        google.maps.event.addListener(marker, 'click', function() {
                            infowindow.open(map, marker);
                        });
                    }
                });
            }
        }    
    }

    $(document).ready(function() {

        GetShelters();                
    });

【问题讨论】:

    标签: c# javascript jquery asp.net


    【解决方案1】:

    我猜你复制了一个对象或一个数组。您需要提供有关地址[项目]的更多信息

    在 javascript 中,复制字符串或布尔值之类的内容会得到实际副本,但复制对象或数组 only gives a reference

    var foo = [1, 2, 3];
    var bar = foo;
    bar[1] = 5;
    alert(foo[1]);
    // alerts 5
    

    编辑新信息:如果您加载了 jQuery,克隆 JS 对象的快速方法是使用 $.extend()

    // Shallow copy
    var newObject = jQuery.extend({}, oldObject);
    
    // Deep copy
    var newObject = jQuery.extend(true, {}, oldObject);
    

    对于一个数组,你可以只使用 javascript 的 slice()

    a = [1];
    b = a.slice();
    

    这取决于 retValue[x]["Address"] 是什么以及您加载了哪些库。

    【讨论】:

    • 不,你没有,你只是移动了丢失的信息。现在我们需要知道 retValue[x]["Address"] 是什么。那就是您“推送”到地址[项目]的东西。再说一遍,这个东西很可能是一个对象或者一个数组,所以它需要被克隆,而不是被引用。阅读我提供的链接。
    • 感谢您的帮助 :) 抱歉造成误解。地址是来自服务器端的通用集合
    • 我会从 "for (x in retValue) { alert(typeof(retValue[x]..." 开始了解它是什么。
    猜你喜欢
    • 2017-06-25
    • 2011-08-21
    • 1970-01-01
    • 2012-08-22
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    相关资源
    最近更新 更多