2013-05-09 65 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燒製單單擊和雙擊事件是一個錯誤。這在很多情況下很有用。