【问题标题】:Temporary disable "viewchangeend" event暂时禁用“视图更改结束”事件
【发布时间】:2015-10-05 10:45:51
【问题描述】:

如何暂时禁用viewchangeend 事件,使用setView 方法更改视图并再次启用viewchangeend 事件?

这是我现在正在做的更轻松的版本:

var mapEventsObjects = [];

/* Remove map events */
for ( var i = 0; i < mapEventsObjects.length; i++ ) {
    Microsoft.Maps.Events.removeHandler( mapEventsObjects[i] );
}

/* Change the view */
map.setView({
    "zoom": zoom,
    "center": new Microsoft.Maps.Location( lat, long )
});

/* Add map events back */
var mapViewChangeEnd = Microsoft.Maps.Events.addHandler(map, "viewchangeend", function (e) {
    console.log("viewChangeEnd Fired: ", e );
});

mapEventsObjects.push( mapViewChangeEnd );

我希望在控制台中看不到 viewChangeEnd Fired,但它不是出现一次而是出现两次。

知道为什么它不起作用吗?

【问题讨论】:

    标签: javascript dom-events bing-maps


    【解决方案1】:

    您可以创建一个简单布尔值的 gobal 变量。如果要忽略 viewchangeend 事件,请将变量设置为 true。然后在 viewchangeend 事件的事件处理程序中,您可以做一个简单的检查,如果此变量为 true,请将变量设置为 false 并退出函数。这是您的代码的修改版本:

    var mapEventsObjects = [], skipViewChangeEnd = false;
    
    //Add view change end event to map.
    var mapViewChangeEnd = Microsoft.Maps.Events.addHandler(map, "viewchangeend", function (e) {
        //Check to see if you want to skip this event once.
        if(skipViewChangeEnd){
            skipViewChangeEnd = false;
            console.log("viewChangeEnd skipped");
        }else{
            //Your logic for handling this event
            console.log("viewChangeEnd Fired: ", e );
        }
    });
    
    mapEventsObjects.push( mapViewChangeEnd );
    
    skipViewChangeEnd = true;
    
    /* Change the view */
    map.setView({
        "zoom": zoom,
        "center": new Microsoft.Maps.Location( lat, long )
    });
    

    【讨论】:

    • 我需要在调用setView 之前暂时禁用事件,然后重新启用它。由于 JS 的异步特性,如果我将该变量设置为 true,然后调用 setView 并再次将其设置回 false,则在调用 setView 时它将为 false。
    • 不,不会的。在触发 setView 调用并且地图完成移动之前,它不会设置为 false。这个方法其实我用过好几次了。
    • 您永远不会重新启用该事件。调用setView 后,您必须将skipViewChangeEnd 设置为true,这样它才能继续正常工作。但是如果你这样做,它将在setView 完成之前设置true,因此让事件再次触发。
    • 只需要在下次调用setView时设置为true即可。在此之前,skipViewChangedEnd 变量应保持为 false。您的代码示例仅显示调用 setView 一次。
    • 感谢后续 cmets。我已经用另一种方式解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2020-02-11
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2012-06-02
    相关资源
    最近更新 更多