2013-05-09 74 views
0

执行两次,我一直在使用的setTimeout问题。我一直使用它很多次,它总是以我期望的方式工作。即使我把代码放在一个单独的函数中,它也可以工作,但在这种情况下它有一个奇怪的行为。的JavaScript window.setTimeout在particual情况下

这里是一个非常代码:

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函数被执行两次。

你有什么解决方案什么,我做错了什么?

+0

这有可能是超时之前经过的双击被激发。尝试增加超时时间并检查它是否仍然发生 – Kenneth 2013-05-09 18:22:46

+1

难道双击操作实际上会触发*两个单击事件(以及双击事件)? – 2013-05-09 18:53:43

+0

也'RoutePatternPoint.markerDoubleClickFix === FALSE'不会是真的第一次,除非你明确地设定为'FALSE'别的地方。使用'!RoutePatternPoint.markerDoubleClickFix'或'=='可能更好。 – 2013-05-09 18:58:36

回答

1

您可能需要做这样的事情:

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; 
     } 
    }); 
} 

我不认为谷歌地图API V3烧制单单击和双击事件是一个错误。这在很多情况下很有用。