2011-02-14 44 views
3

我有點擊和doubleclicks區分下面的代碼片段:單一的區分,然後雙擊

observeSingleAndDoubleClick: function (element, singleClickHandler, doubleClickHandler, timeout) { 
    var clicks; 
    $(element).observe('click', function (event) { 
     ++clicks; 
     if (clicks === 1) { 
      var timeoutCallback = function (event) { 
       if (clicks === 1) { 
        singleClickHandler.call(this, event); 
       } else { 
        doubleClickHandler.call(this, event); 
       } 
       clicks = 0; 
      }; 
      timeoutCallback.bind(this).delay(timeout/1000); 
     } 
    }.bind(this)); 
} 

問題:該事件不會再活下去了當延遲迴調函數被調用。雖然它在Firefox中有效,但它不在IE8中。傳遞給點擊處理程序的事件對象「已死」,因爲事件本身已經通過。

任何人有一個建議如何解決這個問題?

+1

坦率地說,我不會這樣做。瀏覽器計時器的可靠性非常低,以至於會讓用戶瘋狂。網絡一般不會雙擊。 – Pointy 2011-02-14 14:07:49

+0

爲什麼不使用onclick和ondblclick?它是不支持它的對象嗎? http://msdn.microsoft.com/en-us/library/ms536921%28v=vs.85%29.aspx https://developer.mozilla.org/en/DOM/element.ondblclick – mplungjan 2011-02-14 14:10:06

+3

@mplungian即使這樣有必要添加某種計時器代碼。爲什麼?因爲每個「dblclick」都會首先觸發「點擊」事件。因此,您的「click」事件處理程序必須等待以查看是否也發生了「dblclick」。一團糟。 – Pointy 2011-02-14 14:15:46

回答

1

我知道OpenLayers項目有些類似。看這個文件中的第210行:OpenLayers.Handler.Click sourcecode

我不知道如何與原型框架用這個,但我希望它可以讓你以正確的方式:)

另一件事:那豈不是更好地使用鼠標鬆開事件,而不是點擊?

3

不僅要觀察點擊事件,還要觀察doubleclick事件。

$(element).observe('click',singleClickHandler); 
$(element).observe('dblclick',doubleClickHandler); 

這是一個改變的版本後,所有的討論:

var clicks;  
observeSingleAndDoubleClick: function (element, singleClickHandler, doubleClickHandler, timeout) { 

$(element).observe('click', function (event) { 
    ++clicks; 
    if (clicks === 1) { 
     var timeoutCallback = function (event) { 
      if (clicks === 1) { 
       singleClickHandler.call(this, event); 
      } else { 
       doubleClickHandler.call(this, event); 
      } 
      clicks = 0; 
     }; 
     timeoutCallback.bind(this, event).delay(timeout/1000); 
    } 
}.bind(this)); 

}

0

有一個關於原型dblclick事件ID。你爲什麼不使用它?

observeSingleAndDoubleClick: function (element, singleClickHandler, doubleClickHandler) { 

    $(element).observe('click', function (event) { 
    singleClickHandler.call(this, event); 
    } 

    $(element).observe('dblclick', function (event) { 
    doubleClickHandler.call(this, event); 
    } 
} 
相關問題