我正在处理DOM元素上的单击和双击事件。每个事件执行不同的命令,但是当双击该元素时,除了触发双击事件外,还会触发两次单击事件。有什么防止这种行为的最佳方法吗?
我正在处理DOM元素上的单击和双击事件。每个事件执行不同的命令,但是当双击该元素时,除了触发双击事件外,还会触发两次单击事件。有什么防止这种行为的最佳方法吗?
如果有其他人像我一样偶然发现这个问题并在寻找答案,我能想到的最好解决方案如下:
$node.on('click',function(e){
if(e.originalEvent.detail > 1){
return;
/* if you are returning a value from this
function then return false or cancel
the event some other way */
}
});
完成。如果有多次连续点击,第二次、第三次等不会触发。我肯定更喜欢这种方法,而不是使用任何类型的计时器。
我通过阅读这篇文章找到了这个方法。
顺便说一下:我最初研究这个问题是因为我不小心双击了一个分页链接,事件在回调发生之前触发并完成两次。
在想出上面的代码之前,我曾经尝试过
if e.originalEvent.detail === 2 //return
然而,我成功地点击了链接三次(三连击),尽管第二次点击没有生效,但第三次点击生效了。
UIEvent.detail
来检测元素被点击的次数,并基于此触发事件。element.addEventListener("click", function (e) {
if (e.detail === 1) {
// do something if the element was clicked once.
} else if (e.detail === 2) {
// do something else if the element was clicked twice
}
});
感谢这里所有其他答案的贡献,它们的结合似乎为我提供了一个合理的解决方案,当交互需要同时使用,但又互相排斥时:
var pendingClick = 0;
function xorClick(e) {
// kill any pending single clicks
if (pendingClick) {
clearTimeout(pendingClick);
pendingClick = 0;
}
switch (e.detail) {
case 1:
pendingClick = setTimeout(function() {
console.log('single click action here');
}, 500);// should match OS multi-click speed
break;
case 2:
console.log('double click action here');
break;
default:
console.log('higher multi-click actions can be added as needed');
break;
}
}
myElem.addEventListener('click', xorClick, false);
更新:我在这个Github仓库中添加了一个通用版本的方法,并为触摸设备添加了一个点击填充示例:
boolDoubleClick == true
,那么不要 fire/handle
单击事件。这是我在模块内区分的方法:
node.on('click', function(e) {
//Prepare for double click, continue to clickHandler doesn't come soon enough
console.log("cleared timeout in click",_this.clickTimeout);
clearTimeout(_this.clickTimeout);
_this.clickTimeout = setTimeout(function(){
console.log("handling click");
_this.onClick(e);
},200);
console.log(_this.clickTimeout);
});
node.on('dblclick', function (e) {
console.log("cleared timeout in dblclick",_this.clickTimeout);
clearTimeout(_this.clickTimeout);
// Rest of the handler function
我在我的项目中使用这个解决方案来防止点击事件的触发,如果我有一个双击事件需要执行不同的操作。
注意:这个解决方案仅适用于单击和双击事件,而不包括三击等其他事件。
要查看单击和双击之间的正确时间间隔,请参见此处
抱歉我的英语不太好,希望这对你有所帮助 :)
var button, isDblclick, timeoutTiming;
var clickTimeout, dblclickTimeout;
//-----
button = $('#button');
isDblclick = false;
/*
the proper time between click and dblclick is not standardized,
and is cutsomizable by user apparently (but this is windows standard I guess!)
*/
timeoutTiming = 500;
//-----
button.on('dblclick', function () {
isDblclick = true;
clearTimeout(dblclickTimeout);
dblclickTimeout = setTimeout(function () {
isDblclick = false;
}, timeoutTiming);
//-----
// here goes your dblclick codes
console.log('double clicked! not click.');
}).on('click', function () {
clearTimeout(clickTimeout);
clickTimeout = setTimeout(function () {
if(!isDblclick) {
// here goes your click codes
console.log('a simple click.');
}
}, timeoutTiming);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button type="button" id="button">
click/dblclick on this to see the result
</button>
addEventListener
,除非您不使用 jQuery
的其他功能。 - MMDM
var clickHandler = function(e) { /* put click event handling code here */ };
var doubleclickHandler = function(e) { /* put doubleclick event handling code here */ }
const maxMsBetweenClicks = 300;
var clickTimeoutId = null;
document.addEventListener("dblclick", handleDoubleClick);
document.addEventListener("click", handleSingleClick);
function handleSingleClick(e){
clearTimeout(clickTimeoutId);
clickTimeoutId = setTimeout( function() { clickHandler(e);}, maxMsBetweenClicks);
}
function handleDoubleClick(e){
clearTimeout(clickTimeoutId);
doubleclickHandler(e);
}
我知道这个问题很老了,但是我还是想发一篇文章,因为我最近遇到了同样的问题。以下是我解决它的方法。
$('#alerts-display, #object-display').on('click', ['.item-data-summary', '.item-marker'], function(e) {
e.preventDefault();
var id;
id = setTimeout(() => {
// code to run here
return false;
}, 150);
timeoutIDForDoubleClick.push(id);
});
$('.panel-items-set-marker-view').on('dblclick', ['.summary', '.marker'], function(e) {
for (let i = 0; i < timeoutIDForDoubleClick.length; i++) {
clearTimeout(timeoutIDForDoubleClick[i]);
}
// code to run on double click
e.preventDefault();
});
$node.on('click', function (e) { if (e.originalEvent.detail > 1 || alreadyClicked == true) { alreadyClicked = false; return; } alreadyClicked = true; //Code here. alreadyClicked = false; })
当然,您需要在脚本主体中声明变量并在document.ready中设置它。 我知道这个问题很旧,但它仍然存在问题。 - NotImplementedExceptione.originalEvent
未定义。 - Rahul