我在移动设备/平板电脑上遇到了事件触发两次的问题。当我点击下面的功能时,应该下拉的菜单会下拉,然后立即滑回上面。这只是触屏设备的问题。
$(document).on("touchend click", ".lines-button", function(e){
e.stopImmediatePropagation();
if($(this).hasClass("close")){
$(this).removeClass("close");
$(".widget1x1Back").next(".actionsHolder3").slideUp("fast", function() {
$(this).remove();
});
}else{
var iconsList = $(this).closest(".top1x1").next(".hdnActnLst").find(".iconsHolder3").html();
$(this).closest(".widget1x1").append(iconsList);
$(this).closest(".widget1x1").find(".actionsHolder3").hide();
$(this).closest(".widget1x1").find(".actionsHolder3").slideDown(700,"easeOutBack");
$(this).addClass("close");
}
});
任何输入将是伟大的,谢谢!!
您的问题是,您的函数被触发两次(一次为每个事件类型)。参见演示在这里(我使用mousedown
和click
,因为我现在在台式机上-但它的原理相同)。
您需要捕获并处理对事件的重复调用。您可以尝试设置一个已处理的布尔值,以便click
事件知道touch
事件是否处理了该事件(触摸事件应该首先触发)。像这样…
var handled = false;
$(document).on("touchend click", ".lines-button", function(e){
e.stopImmediatePropagation();
if(e.type == "touchend") {
handled = true;
handleIt();
}
else if(e.type == "click" && !handled) {
handleIt();
}
else {
handled = false;
}
});
function handleIt() {
if($(this).hasClass("close")){
$(this).removeClass("close");
$(".widget1x1Back").next(".actionsHolder3").slideUp("fast", function() {
$(this).remove();
});
}else{
var iconsList = $(this).closest(".top1x1").next(".hdnActnLst").find(".iconsHolder3").html();
$(this).closest(".widget1x1").append(iconsList);
$(this).closest(".widget1x1").find(".actionsHolder3").hide();
$(this).closest(".widget1x1").find(".actionsHolder3").slideDown(700,"easeOutBack");
$(this).addClass("close");
}
}
在大多数情况下,下面的代码是可以的:
$(document).on("touchend click", ".lines-button", function(e){
if(e.type == 'touchend'){
$(this).off('click');
}
});
如果touchend
工作,你可以摆脱click
。
下面是对@JRules答案的一个小修改
// lo is just a global object holder
let lo = {
"handled":false
}
使用委托,因为对象没有在原始页面加载
$('body').delegate('.linkRow','click touchend',function(e) { //
e.stopPropagation();
if(lo.handled === false){ // check
doSomething()
lo.handled = true
}
setTimeout(() => { // now set to false later (example here is 1/2 sec)
lo.handled = false
}, 500)
});