JS中双击和单击事件冲突的解决方法及案例

JS中双击和单击事件冲突的解决方法及案例

问题前置条件:

        在JS中,针对同一DOM操作中有时会同时用到单击、双击事件(ps:单击和双击事件执行不同的函数),但通常会遇到一个问题,就是在双击的时候即执行了一次双击事件,而且还执行了两次单击事件。此类冲突在ZTree中经常遇到(下面附有案例)。

解决办法:

        想要解决两个事件冲突,需要对单击事件进行延时,如果在此延时中又监测到单击事件,那么认为此两次单击属于一个双击事件,则只执行双击事件并第一时间将延时定时器清理,以防止第二次单击时生效。

结合zTree插件案例:

三级树形结构,当单击任何一级树结构时回显数据,当双击时展开所点击的树结构

function initEventLbTree() {
    var eventSetting = {
        view : {
            dblClickExpand : true
        },
        data : {
            key : {
                name : 'text'
            },
            simpleData : {
                enable: true,
                idKey: "id",
                pIdKey: "pid",
                rootPId:null,
            }
        },
        callback : {
            onClick : OnClick,//单击事件
            onDblClick: OnDblClick//双击事件
        }
    };
    createTree("incDealName","/groupAction/getGroupsAndUserByCtis",{geogIds:$("#geogid").val(),
        flowCode:$("#processType").val()},null,null,null,eventSetting);//创建树结构
}
var clickFlag = null;//是否点击标识(定时器编号)
function OnClick(e,treeId, treeNode) {
    if(clickFlag) {//取消上次延时未执行的方法
	clickFlag = clearTimeout(clickFlag);//清除定时器,防止第二次点击生效
    } 
    clickFlag = setTimeout(function() {//单击事件,回显点击项到输入框 
        var nodes; 
        var parentsNode; 
        var grandParentNode; 
        loadClickNodes(e, treeId, treeNode); 
        var zTree = $.fn.zTree.getZTreeObj(treeId);
        nodes = zTree.getSelectedNodes(); 
        parentsNode = nodes[0].getParentNode(); 
        grandParentNode = parentsNode.getParentNode();
        if (nodes[0] == null) { return; 
        } else { 
            parentsNode = nodes[0].getParentNode(); 
            if (parentsNode == null) { 
                var incDealName = nodes[0].text; s
                etInputValue(incDealName,nodes[0].id); 
            } else { 
                grandParentNode = parentsNode.getParentNode();
            if (grandParentNode == null) {
                 var incDealName = parentsNode.text + "/" + nodes[0].text; 
                 setInputValue(incDealName,nodes[0].id); 
            } else { 
                var incDealName = grandParentNode.text + "/" + parentsNode.text + "/" + nodes[0].text; setInputValue(incDealName,nodes[0].id); 
    } } } $("#" + treeId).trigger("selected"); }, 300);//延时300毫秒执行}
    function OnDblClick(e, treeId, treeNode) {//双击事件:清除定时器,展开点击的树结构 
        if(clickFlag) {//取消上次延时未执行的方法 
            clickFlag = clearTimeout(clickFlag);//清除定时器,防止第二次点击生效 } 
        var treeObj = $.fn.zTree.getZTreeObj(treeId); 
        var nodes = treeObj.getSelectedNodes(); 
        if (nodes.length>0) { 
            treeObj.expandNode(nodes[0], true, true, true);//展开点击的树结构 
}}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值