Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有单个信息窗口的多个地图标记_Javascript_Google Maps Api 3 - Fatal编程技术网

Javascript 具有单个信息窗口的多个地图标记

Javascript 具有单个信息窗口的多个地图标记,javascript,google-maps-api-3,Javascript,Google Maps Api 3,我的闭包技巧不是很好,我试图保留每个InfoWindows的引用以供以后使用,但似乎无法从这里继续。不管我点击哪个标记,都会打开相同的信息窗口。不要担心{{}Django模板代码,这很好 $( document ).ready(function() { var map; var myLatlng; var marker = []; var infowindow = [];

我的闭包技巧不是很好,我试图保留每个InfoWindows的引用以供以后使用,但似乎无法从这里继续。不管我点击哪个标记,都会打开相同的信息窗口。不要担心{{}Django模板代码,这很好

        $( document ).ready(function() {

            var map;
            var myLatlng;
            var marker = [];
            var infowindow = [];
            var map_markers = [];

            {% for map_marker in map_markers %}
            map_markers.push({
                'lat':{{map_marker.latitude}},
                'lng':{{map_marker.longitude}},
                'icon':{% if map_marker.icon %}'{{map_marker.icon.url}}'{% else %}''{% endif %},
                'info':{% if map_marker.info %}'{{map_marker.info.strip|safe|escapejs}}'{% else %}''{% endif %},
            });
            {% endfor %}

            var mapOptions = {
                zoom: {{map_settings.zoom}},
                center: new google.maps.LatLng({{map_settings.latitude}}, {{map_settings.longitude}})
            };

            map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

            for (i in map_markers){

                myLatlng = new google.maps.LatLng( map_markers[i].lat , map_markers[i].lng );

                marker[i] = new google.maps.Marker({
                    position: myLatlng,
                    map: map,
                    title: 'Marker',
                    icon: map_markers[i].icon
                });

                if ( map_markers[i].info ){

                    infowindow[i] = new google.maps.InfoWindow({
                        content: map_markers[i].info
                    });

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

                }
            }

        });

如果能从这个问题上继续下去就太好了,因为我一直在绕圈子。感谢您的帮助。

修复了它。。。添加了以下功能

            function marker_click(marker,infowindow){
                google.maps.event.addListener(marker, 'click', function() {
                    infowindow.open(map,marker);
                });
            }
然后叫它

marker_click(marker[i], infowindow[i]);

一种选择是使用标记的成员变量,而不是函数闭包。将(自定义)成员添加到标记(例如iWcontent):

在标记单击功能中使用该选项:

google.maps.event.addListener(marker[i], 'click', function() {
   infowindow.setContent(this.iWcontent);
   infowindow.open(map,this);
});

代码段:

var地理编码器;
var映射;
var映射_标记=[];
var标记=[];
var infowindow=new google.maps.infowindow();
地图推送({
“lat”:45,
“液化天然气”:-75,
“图标”:null,
“信息”:“{0}”
});
地图推送({
“lat”:45.5,
“液化天然气”:-75.5,
“图标”:null,
“信息”:“{1}”
});
函数初始化(){
变量映射选项={
缩放:5,
中心:新google.maps.LatLng(45,-75)
};
map=new google.maps.map(document.getElementById('map-canvas'),mapOptions);
用于(地图标记中的i){
myLatlng=new google.maps.LatLng(地图标记[i].lat,地图标记[i].lng);
marker[i]=新的google.maps.marker({
职位:myLatlng,
地图:地图,
标题:'标记',
图标:地图标记[i]。图标,
iWcontent:map_标记[i]。信息
});
if(映射标记[i].info){
google.maps.event.addListener(标记[i],'click',函数(){
infowindow.setContent(this.iWcontent);
打开(地图,这个);
});
}
}
}
google.maps.event.addDomListener(窗口“加载”,初始化)
html,主体,#地图画布{
高度:500px;
宽度:500px;
边际:0px;
填充:0px
}


您可以使用JSFIDLE/Plnkr附加一个工作示例吗?您不必使用闭包。您可以将infowindow内容存储在标记的(自定义)成员中。我在发布的代码中没有看到任何试图关闭的行为。我尝试过关闭,但没有成功。我假设infowindow[I].open的元素(map,marker[I]);写得太多了。以前没有使用过的JSFIDLE将看一看。
google.maps.event.addListener(marker[i], 'click', function() {
   infowindow.setContent(this.iWcontent);
   infowindow.open(map,this);
});