单一的区分,然后双击

问题描述:

我有点击和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

我知道OpenLayers项目有些类似。看这个文件中的第210行:OpenLayers.Handler.Click sourcecode

我不知道如何与原型框架用这个,但我希望它可以让你以正确的方式:)

另一件事:那岂不是更好地使用鼠标松开事件,而不是点击?

不仅要观察点击事件,还要观察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)); 

}

有一个关于原型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); 
    } 
}