如果您收到 2 个警报,则您检测双击的阈值似乎太小。尝试增加 150 到 300 毫秒。
另外 - 我不确定你是否能保证 click 和 dblclick 被触发的顺序。因此,当您的 dblclick 被触发时,它会清除第一个click 事件,但如果它在第二个“click”事件之前触发,则第二个事件仍将自行触发,并且您最终会得到一个双击事件触发和单击事件触发。
对于这个潜在问题,我看到了两种可能的解决方案:
1)为实际触发双击事件设置另一个超时。在您的代码中标记双击事件即将触发。然后,当第二个“单击”事件触发时,它可以检查此状态,并说“哎呀,dbl 点击挂起,所以我什么都不做”
2)第二个选项是根据点击事件交换你的目标函数。它可能看起来像这样:
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can stop it
if(firing)
return;
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
el.ondblclick = function() {
firingFunc = doubleClick;
// Now, when the original timeout of your single click finishes,
// firingFunc will be pointing to your doubleClick handler
}
}
基本上这里发生的事情是让您设置的原始超时继续。它总是会调用 fireFunc(); 唯一改变的是 fireFunc() 实际指向的内容。一旦检测到双击,它就会将其设置为 doubleClick。然后,一旦超时到期,我们总是会恢复为 singleClick。
我们还有一个“触发”变量,所以我们知道要拦截第二次单击事件。
另一种选择是完全忽略 dblclick 事件,只需通过单击和计时器来检测它:
window.onload = function() {
var timer;
var el = document.getElementById('testButton');
var firing = false;
var singleClick = function(){
alert('Single');
};
var doubleClick = function(){
alert('Double');
};
var firingFunc = singleClick;
el.onclick = function() {
// Detect the 2nd single click event, so we can set it to doubleClick
if(firing){
firingFunc = doubleClick;
return;
}
firing = true;
timer = setTimeout(function() {
firingFunc();
// Always revert back to singleClick firing function
firingFunc = singleClick;
firing = false;
}, 150);
}
}
这是未经测试的:)