Javascript 谷歌地图信息窗口在加载时打开,而不是单击

Javascript 谷歌地图信息窗口在加载时打开,而不是单击,javascript,google-maps,infowindow,Javascript,Google Maps,Infowindow,我一直在做这件事,我是如此接近!首次使用CustomMarker和MarkerCluster 下面的javascript工作得很好,除了加载页面时信息窗口都是打开的。我希望它们在单击标记时打开 <script> function initMap() { var newYork = {lat: 40.7127837, lng: -74.00594130000002}; var map = new google.maps.Map(document.getElementBy

我一直在做这件事,我是如此接近!首次使用CustomMarker和MarkerCluster

下面的javascript工作得很好,除了加载页面时信息窗口都是打开的。我希望它们在单击标记时打开

<script>
function initMap() {
    var newYork = {lat: 40.7127837, lng: -74.00594130000002};
    var map = new google.maps.Map(document.getElementById("user-matches-map"), {
        zoom: 12,
        center: new google.maps.LatLng(newYork),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });
    var markers = []
    var matches = $.getJSON('get_json_matches', function(matches){
        var matches = matches
        for(i=0; i < matches.length; i++) {
            //console.log(matches[i])
            var firstName = matches[i][1]
            var lat = matches[i][4]
            var lng = matches[i][5]
            var slugUrl = matches[i][6]

            //get the user's image, and if it's missing, call the correct image path
            if(matches[i][0] === "thumb/missing.png") {
                var image = "http://localhost:3000/assets/medium/missing-e38aa1831b278c511eff9812efc6fda028d46b3b94f71cc88c3e0ba0e99ff19e.png"
            } else {
                var image = "http://" + location.host + matches[i][0];
            }

            //if the user has lat lng, plot them on the map
            if (lat != null) {
                var contentString = '<div>'+'<h1>Hello '+ firstName +'</h1>'+'</div>'
                var infowindow = new google.maps.InfoWindow({
                    content: contentString
                });

                marker = new CustomMarker(
                    new google.maps.LatLng(lat, lng), 
                    map, 
                    image, 
                    firstName, 
                    contentString)
                marker.info = new google.maps.InfoWindow({
                    content: contentString
                });
                google.maps.event.addListener(marker, 'click', (function (marker, i) {
                    infowindow.open(map, marker);
                }
                )(marker, i));
                markers.push(marker);
            } 
        }
    var markerCluster = new MarkerClusterer(map, markers,
        {imagePath: 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'});
});

}
initMap();

function CustomMarker(latlng, map, imageSrc, firstName, contentString) {
    this.latlng_ = latlng;
    this.imageSrc = imageSrc;
    this.firstName = firstName
    $(this).on('click', function (event) {
        console.log('click')
    });
    // Once the LatLng and text are set, add the overlay to the map.  This will
    // trigger a call to panes_changed which should in turn call draw.
    this.setMap(map);
}
CustomMarker.prototype = new google.maps.OverlayView();
CustomMarker.prototype.draw = function () {
    // Check if the div has been created.
    var div = this.div_;
    if (!div) {
        // Create a overlay text DIV
        div = this.div_ = document.createElement('div');
        // Create the DIV representing our CustomMarker
        div.className = "customMarker"
        var img = document.createElement("img");
        img.src = this.imageSrc;
        div.appendChild(img);
        google.maps.event.addDomListener(marker, "click", function (event) {
            google.maps.event.trigger(me, "click");
        });
        // Then add the overlay to the DOM
        var panes = this.getPanes();
        panes.overlayImage.appendChild(div);
    }
    // Position the overlay 
    var point = this.getProjection().fromLatLngToDivPixel(this.latlng_);
    if (point) {
        div.style.left = point.x + 'px';
        div.style.top = point.y + 'px';
    }
};
CustomMarker.prototype.remove = function () {
    // Check if the overlay was on the map and needs to be removed.
    if (this.div_) {
        this.div_.parentNode.removeChild(this.div_);
        this.div_ = null;
    }
};
//create a prototype of the image marker
CustomMarker.prototype.getPosition = function () {
    return this.latlng_;
};
</script>

函数initMap(){
var newYork={lat:40.7127837,液化天然气:-74.0059413000002};
var map=new google.maps.map(document.getElementById(“用户匹配地图”){
缩放:12,
中心:新谷歌。地图。拉廷(纽约),
mapTypeId:google.maps.mapTypeId.ROADMAP
});
变量标记=[]
var matches=$.getJSON('get_json_matches',函数(matches){
变量匹配=匹配
对于(i=0;i
如果信息窗口在eventListener函数中,为什么会在加载时打开


如果你需要更多的细节,请告诉我。谢谢

如评论中所述,您已经创建了一个

发件人:

立即调用的函数表达式(或IIFE,发音为 “iffy”)是一种JavaScript编程语言习惯用法,它产生 使用JavaScript函数作用域的词法作用域。立即调用 函数表达式可用于避免变量从 在区块内,防止污染全球环境和环境 同时允许公众访问方法,同时保留隐私 对于函数中定义的变量

在添加标记的单击处理程序的部分,脚本执行以下操作:

创建一个匿名函数,将当前的
标记
(和索引
i
)传递给它,并立即执行它:

(function (marker, i) { infowindow.open(map, marker); })(marker, i)
此IIFE(
未定义
)的结果用作标记的单击处理程序:

google.maps.event.addListener(marker, 'click', undefined);
除非您可以切换到ES6,并且必须使用IIFE来防止范围界定问题:



要使脚本正常工作,必须更改此部分:

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


因为这是一个例子,您正在使用这个
(函数(marker,i){infowindow.open(map,marker);})(marker,i)
是一个iLife-实际上,您正在将调用这个函数的结果作为第三个参数传递给
google.maps.event.addListener
-然而,你需要通过考试谢谢,我从没听说过IFEE。当我删除第三个参数时,调用函数:
(marker,I)
它不会在单击时启动。我还尝试将其更改为
marker.addListener('click',function(){infowindow.open(map,marker);})但这不起作用
google.maps.event.addListener(marker, 'click', (function (marker) {  // I've removed the index because it is unused
    return function() { infowindow.open(map, marker); };
})(marker));