0

我在使用 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 在实现单击和双击事件时存在错误 - 它们都被执行。

所以解决的办法就是减慢单击事件的速度,看看是否执行了双击事件。如果执行了双击事件,那么我们中断单击事件。

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

我究竟做错了什么?

4

1 回答 1

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 同时触发单击和双击事件是一个错误。这在很多情况下都很有用。

于 2013-05-09T18:44:16.470 回答