Javascript 自定义缩放控件导致超出最大调用堆栈大小错误

Javascript 自定义缩放控件导致超出最大调用堆栈大小错误,javascript,google-maps,Javascript,Google Maps,在iOS上使用Google Maps JavaScript API时,我试图更改缩放增量。例如,我不想从zoom 14变为zoom 15,而是希望它直接变为zoom 16,然后变为zoom 18,依此类推。。。当用户使用收缩缩放手势时 我知道我可以通过按钮来实现这一点,但我似乎找不到一个解决办法来实现从捏到缩放的手势。我意识到需要跟踪zoom\u changed事件 使用map.setZoom(zoom+2)时,我得到一个错误,超过了最大调用堆栈大小和map.setZoom(zoom-2)分别添

在iOS上使用Google Maps JavaScript API时,我试图更改缩放增量。例如,我不想从zoom 14变为zoom 15,而是希望它直接变为zoom 16,然后变为zoom 18,依此类推。。。当用户使用收缩缩放手势时

我知道我可以通过按钮来实现这一点,但我似乎找不到一个解决办法来实现从捏到缩放的手势。我意识到需要跟踪
zoom\u changed
事件

使用
map.setZoom(zoom+2)时,我得到一个错误,超过了
最大调用堆栈大小
map.setZoom(zoom-2)分别添加到第17行和第19行时

检查此JSFIDLE:。这是我需要帮助的部分:

if (useragent.indexOf('iPhone') != -1) {
    google.maps.event.addListener(map, 'zoom_changed', function () {
        if (map.getZoom() > zoom) {
            alert("ZOOMED IN from Level " + zoom);
        } else if (map.getZoom() < zoom) {
            alert("ZOOMED OUT from Level " + zoom);
        }
        zoom = map.getZoom();
    });
}
if(useragent.indexOf('iPhone')!=-1){
google.maps.event.addListener(映射'zoom_changed',函数(){
if(map.getZoom()>缩放){
警报(“从级别放大”+缩放);
}else if(map.getZoom()

顶部的按钮演示了我试图实现的功能,但使用了“收缩到缩放”手势。

如果您在问题中指向的位置添加这些行,您将在事件
zoom\u changed
内触发事件
zoom\u changed
,这将创建stackoverflow,因为它永远不会停止触发事件

if (useragent.indexOf('iPhone') != -1) {
    google.maps.event.addListener(map, 'zoom_changed', function () {
        if (map.getZoom() > zoom) {
            map.setZoom(zoom + 2); //This will trigger "zoom_changed" again
        } else if (map.getZoom() < zoom) {
            map.setZoom(zoom - 2); //This will trigger "zoom_changed" again
        }
        zoom = map.getZoom();
    });
}
简单方法:

仅当当前缩放不是偶数时设置新缩放(这将停止无限循环)



Hmm我仍然会遇到同样的错误。更新的JSIDLE:。不应该
oldZoom+2
oldZoom-2
应该在
map.setZoom()内?使用
alert
标签,我可以看到缩放增加了2,但地图上没有设置。我不知道为什么会被否决……谢谢Molle博士。这是最好的解决办法。
if (useragent.indexOf('iPhone') != -1) {
    google.maps.event.addListener(map, 'zoom_changed', function () {
        var newZoom = map.getZoom(), oldZoom = zoom;
        if (newZoom > oldZoom) {
            oldZoom + 2;
        } else if (newZoom < oldZoom) {
            oldZoom - 2;
        }
        zoom = oldZoom;
        map.setZoom(oldZoom);
    });
}
    google.maps.event.addListener(map,'zoom_changed',function(){
      var z=this.getZoom();
      if(z%2){//when zoom is a odd number
        var fx=((!isNaN(this.get('z'))&&this.get('z')<z))?2:0;
        this.setZoom(Math.floor(z/2)*2+fx);
      }else{
        this.set('z',z);
      }
    });