我想制作模型[i] .marker.addListener('点击',function(){在for循环

时间:2017-06-11 14:49:50

标签: javascript

此代码运行但不符合 javascript 最佳做法,请在for循环外添加model[i].marker.addListener('click', function(),但我遇到了问题。

function pushMarkers() {
locInfo = new google.maps.InfoWindow();
for (var i = 0; i < model.length; i++) {
    var loc = model[i].places;
    var title = model[i].title;
    model[i].marker = new google.maps.Marker({
        position: loc,
        title: title,
        animation: google.maps.Animation.DROP,
        map: map,
        id: i
    });
    console.log(model[i].title);
    model[i].marker.addListener('click', function() {
        console.log('InfoWindow Loop entered');
        toggleBounce(this);
        populateInfoWindow(this, locInfo);
    });
    wikiLink(model[i].marker);
  }
}

1 个答案:

答案 0 :(得分:1)

您只需创建一个用作回调的命名函数,然后使用它:

function pushMarkers() {

    // Create it
    function mapClickCallback() {
        console.log('InfoWindow Loop entered');
        toggleBounce(this);
        populateInfoWindow(this, locInfo);
    }

    locInfo = new google.maps.InfoWindow();
    for (var i = 0; i < model.length; i++) {
        var loc = model[i].places;
        var title = model[i].title;
        model[i].marker = new google.maps.Marker({
            position: loc,
            title: title,
            animation: google.maps.Animation.DROP,
            map: map,
            id: i
        });
        console.log(model[i].title);
        model[i].marker.addListener('click', mapClickCallback); // <−−−− Use it
        wikiLink(model[i].marker);
    }
}

很好,函数定义在locInfo之上,但如果您愿意,只要它位于顶部,您就可以将函数声明放在pushMarkers内的任何位置。该功能的水平。 (从ES2015开始,它定义的行为不使用顶层的函数声明,但是没有必要在这里,它的规则有点复杂。)

旁注:您的代码正在成为The Horror of Implicit Globals 的牺牲品(这是我贫血的小博客上的帖子);请务必使用locInfo声明var