You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript变量作用域问题:Google Maps API中Counter始终为0

问题分析与解决

问题根源

你遇到的问题不是作用域或变量提升,而是异步操作的执行顺序。downloadUrl是异步发起HTTP请求的函数,它的回调函数会在请求完成后才执行,但你在回调函数外部就去判断counter的值——这时候请求还没返回,counter依然是初始的0,所以无论实际有多少标记,判断逻辑都只会进入else分支。

修复方案

把判断counter和更新按钮的逻辑移到downloadUrl的回调函数内部,确保只有在标记数据加载完成、counter被正确更新后,才执行状态判断:

google.maps.event.addListener(map, 'bounds_changed', function() {
    bounds = map.getBounds();
    var ne = bounds.getNorthEast();
    var sw = bounds.getSouthWest();
    n = ne.lat();
    e = ne.lng();
    s = sw.lat();
    w = sw.lng();
    var counter = 0;
    var xmlfile = 'php-to-xml-dev.php?n=' + n + "&e=" + e + "&s=" + s + "&w=" + w;
    
    downloadUrl(xmlfile, function(doc) {
        var xmlDoc = xmlParse(doc);
        var markers = xmlDoc.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {
            var lat = parseFloat(markers[i].getAttribute("lat"));
            var lng = parseFloat(markers[i].getAttribute("lng"));
            var point = new google.maps.LatLng(lat,lng);
            var content=markers[i].getAttribute("content");
            var icn=markers[i].getAttribute("icon");
            createMarker(point, content, icn);
            counter++;
        }
        
        // 把判断逻辑移到回调内部
        if (counter > 0) {
            locationButton.classList.add("custom-map-control-hidden");
        } else {
            locationButton.textContent = 'No defibs visible. Try zooming out.';
            // 调试用代码可删除:locationButton.textContent = counter;
        }
    });
});

额外建议

如果每次bounds_changed都会重新加载标记,建议在加载新标记前先清除旧标记,避免地图上标记重复堆积。可以维护一个标记数组,每次请求前遍历数组调用marker.setMap(null)清除旧标记。

内容的提问来源于stack exchange,提问作者TrapezeArtist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:03:33