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

时间:2013-05-09 18:19:23

标签: javascript settimeout

我使用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;

    });
}

问题是,当实施单击和双击事件时,谷歌地图api v3有一个错误 - 它们都会被执行。

因此解决方案是减慢单击事件,如果执行双击事件,则参见。如果执行双击事件,则我们中断单击事件。

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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您应该去抖动(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同时触发单击和双击事件是一个错误。这在许多情况下很有用。