javascript窗口.setTimeout在特定情况下执行两次

javascript window.setTimeout executes twice in a particular case

本文关键字:两次 执行 窗口 setTimeout 在特定情况下 javascript      更新时间:2023-09-26

我有一个问题使用setTimeout。我已经用了很多次了,它总是按照我期望的方式工作。即使我把代码放在一个单独的函数中,它也能工作,但只是在这种情况下,它有一个奇怪的行为。

下面是代码:

RoutePatternPoint.prototype.showOnMap = function(map)
{
    var that = this;
    google.maps.event.addListener(this.marker, "click", function(event)
    {
        window.setTimeout(function(){
            if(RoutePatternPoint.markerDoubleClickFix === false) { doSomething(); }
             RoutePatternPoint.markerDoubleClickFix = false;
          },350);
    }); 
    google.maps.event.addListener(this.marker, "dblclick", function(event)
    {
         RoutePatternPoint.markerDoubleClickFix = true;
    });
}

问题是google maps api v3有一个bug,当实现单次和双击事件时,它们都被执行。

因此,解决方案是减慢单次单击事件和,如果执行了双击事件,请参见。如果双击事件被执行,那么我们将中断单次点击事件。

不幸的是,我的代码不是我想要的方式工作,所以我决定写一些警报函数,看看会发生什么。你猜怎么着?单次点击事件中的setTimeout函数执行两次。

我做错了什么?

您应该在用户点击时显示(https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf):

RoutePatternPoint.prototype.showOnMap = function (map) {
    var that = this;
    google.maps.event.addListener(this.marker, "click", function (event) {
        if (that.clickHandler) {
            window.clearTimeout(that.clickHandler);
        }
        that.clickHandler = window.setTimeout(function () {
            doSomething();
        }, 350);
    }); 
    google.maps.event.addListener(this.marker, "dblclick", function (event) {
        if (that.clickHandler) {
            window.clearTimeout(that.clickHandler);
            that.clickHandler = null;
        }
    });
}

我不认为Google Maps API v3触发单点和双击事件是一个bug。这在很多情况下都很有用。