单一的区分,然后双击
问题描述:
我有点击和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中。传递给点击处理程序的事件对象“已死”,因为事件本身已经通过。
任何人有一个建议如何解决这个问题?
答
我知道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);
}
}
坦率地说,我不会这样做。浏览器计时器的可靠性非常低,以至于会让用户疯狂。网络一般不会双击。 – Pointy 2011-02-14 14:07:49
为什么不使用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
@mplungian即使这样有必要添加某种计时器代码。为什么?因为每个“dblclick”都会首先触发“点击”事件。因此,您的“click”事件处理程序必须等待以查看是否也发生了“dblclick”。一团糟。 – Pointy 2011-02-14 14:15:46