使用AJAX控件的v7限制Bing地图的最小/最大缩放?

使用AJAX控件的v7限制Bing地图的最小/最大缩放?,ajax,zooming,bing-maps,Ajax,Zooming,Bing Maps,我正在一个使用Bing Maps AJAX控件v7的站点上工作。我需要做的一件事是限制缩放级别,以防止用户放大到某个级别或缩小到某个级别 我在Map对象上找到了一个“getZoomRange”方法,在检查它之后,它只返回一个带有“min”和“max”属性的对象文本。因此,我认为重载它可能会奏效: // "map" is our Bing Maps object map.getZoomRange = function () { return { max: 14 min

我正在一个使用Bing Maps AJAX控件v7的站点上工作。我需要做的一件事是限制缩放级别,以防止用户放大到某个级别或缩小到某个级别

我在Map对象上找到了一个“getZoomRange”方法,在检查它之后,它只返回一个带有“min”和“max”属性的对象文本。因此,我认为重载它可能会奏效:

// "map" is our Bing Maps object
map.getZoomRange = function ()
{
  return {
    max:      14
    min:      5
  };
};
…但是没有。它没有任何效果(它实际上与使用默认仪表板时缩放滑块的外观有关)


劫持事件并阻止其继续进行似乎也没有任何效果。

根据Bing地图支持,唯一的方法是(这不是特别优雅,并导致地图上出现一些不受欢迎的抖动)如下所示:

// "map" is our Bing Maps object, overload the built-in getZoomRange function
// to set our own min/max zoom
map.getZoomRange = function ()
{
  return {
    max:      14,
    min:      5
  };
};

// Attach a handler to the event that gets fired whenever the map's view is about to change
Microsoft.Maps.Events.addHandler(map,'viewchangestart',restrictZoom);

// Forcibly set the zoom to our min/max whenever the view starts to change beyond them 
var restrictZoom = function ()
{
  if (map.getZoom() <= map.getZoomRange().min) 
  {
    map.setView({
      'zoom':       map.getZoomRange().min,
      'animate':    false
    });
  }
  else if (map.getZoom() >= map.getZoomRange().max) 
  {
    map.setView({
      'zoom':       map.getZoomRange().max,
      'animate':    false
    });
  }
};
/“map”是我们的Bing Maps对象,重载内置的getZoomRange函数
//设置我们自己的最小/最大缩放
map.getZoomRange=函数()
{
返回{
最高:14,
最小:5
};
};
//将处理程序附加到每当映射的视图即将更改时触发的事件
Microsoft.Maps.Events.addHandler(映射、'viewchangestart',restrictZoom);
//当视图开始改变时,强制将缩放设置为最小/最大
var restrictZoom=函数()
{
if(map.getZoom()=map.getZoomRange().max)
{
map.setView({
“缩放”:map.getZoomRange().max,
“动画”:false
});
}
};

我当时正在处理一个类似的问题,结果我做了一件与Jamin先生在回答中描述的非常相似的事情,但有一个(细微但主要的)区别:我为
targetviewchanged添加了一个处理程序。根据MSDN上的说明,
“targetviewchanged”发生在地图所导航的视图发生更改时
。另外,我没有调用
Map#getZoom
,而是使用
Map#getargetzoom
,它
返回地图导航到的视图的缩放级别。注意,这种方法可以防止抖动

以下是我的代码的缩写版本:

function restrictZoom(map,min,max) {
  Microsoft.Maps.Events.addHandler(map,'targetviewchanged',function(){
    var targetZoom = map.getTargetZoom();
    var adjZoom = targetZoom;

    if(targetZoom > max) {
      adjZoom = max;
    } else if(targetZoom < min) {
      adjZoom = min;
    }

    if(targetZoom != adjZoom) {
      map.setView({zoom:adjZoom});
    }
  });
}
功能限制缩放(地图、最小值、最大值){
Microsoft.Maps.Events.addHandler(映射,'targetviewchanged',函数(){
var targetZoom=map.getTargetZoom();
var adjZoom=targetZoom;
如果(目标缩放>最大值){
adjZoom=最大值;
}否则如果(目标缩放<最小值){
adjZoom=min;
}
if(targetZoom!=adjZoom){
setView({zoom:adjZoom});
}
});
}

另一种方法是处理移动鼠标滚轮时引发的事件

处理
mousewheel
事件时,可以检查鼠标滚轮是向前还是向后滚动,然后检查
map.targetZoom()
以与最小或最大缩放值进行比较。如果超过最小值或最大值,则设置
event.handled=true
。这将防止事件被任何其他阻止默认行为的处理程序处理。从文件中:

指示是否处理事件的布尔值。如果这个属性是 设置为true时,事件的默认映射控件行为为 取消了

见下文:

var Zoom = {
    MAX: 10,
    MIN: 2
}

var mouseWheelHandler = function(event) {

    // If wheelDelta is greater than 0, then the wheel is being scrolled forward which zooms in
    if(event.wheelDelta > 0) {
        if(map.getTargetZoom() >= Zoom.MAX) {
            event.handled = true;
        }                        
    }
    else {
        if(map.getTargetZoom() <= Zoom.MIN) {
            event.handled = true;
        }

    }
}

Microsoft.Maps.Events.addHandler(map, 'mousewheel', mouseWheelHandler);
var Zoom={
最高:10,
最小:2
}
var mouseweelHandler=函数(事件){
//如果wheelDelta大于0,则该控制盘将向前滚动并放大
如果(event.wheeldta>0){
if(map.getTargetZoom()>=Zoom.MAX){
event.handled=true;
}                        
}
否则{

如果(map.getTargetZoom())Bing Maps API的v7更新有点破坏了这一点。它在大多数情况下仍能正常工作,但如果用户使用鼠标滚轮主动放大或缩小,“viewchangestart”事件并不总是能正确捕捉到这一点。我的修复方法是在两个页面上调用“restrictZoom”函数“viewchangestart”和“viewchange”事件。我也没有检查缩放是否为“>=”或“”或“这在Bing Maps APIs的v8中对我不起作用”,因此这似乎起作用,但如果他们使用鼠标滚轮缩小地图,会使地图“反弹”,如果他们发送垃圾邮件足够多,则会中断最小/最大缩放。有什么建议吗?