双击事件和单击事件冲突了怎么办?
我在做一个可编辑的列表,想实现单击选中、双击编辑的功能,但发现双击的时候总会先触发一次单击事件,导致编辑框刚弹出来又被取消选中了,体验特别差。有没有办法把这两个事件分开处理?
我试过用 setTimeout 延迟单击的执行,但感觉不太稳定。下面是我给列表项加的样式:
.list-item {
padding: 8px 12px;
cursor: pointer;
user-select: none;
transition: background-color 0.2s;
}
.list-item.selected {
background-color: #e6f7ff;
}
延迟时间 250ms 左右比较合适,太短会误判,太长会感觉卡顿。
最稳的方案是:用一个标志位控制,把单击事件延迟执行,如果在延迟期内检测到双击,就取消单击。
具体做法是这样:
给每个列表项绑定 mousedown 和 dbclick 事件(别用 click 和 dbclick,mousedown 更早触发,控制更精准),在 mousedown 里缓存选中状态,在 dbclick 里直接进入编辑模式,并清除单击的延迟任务。
示例代码:
250ms 是经验值,基本和系统双击时间窗口一致,用户感知不到延迟。
别用 click + dbclick 的组合,因为 click 会比 mousedown 晚触发,窗口期更难控。
要是你列表项特别多,这个方案也扛得住,内存开销就是几个 timer 和变量,稳得很。