Inspired by @Yogi's comments, I found a way to make it:
let parent1 = document.querySelector('#parent1')
let child1 = document.querySelector('#child1')
document.querySelectorAll('.log').forEach(ele => {
ele.addEventListener('pointerdown', e => console.log(ele.id + " pointerdown"))
ele.addEventListener('pointerup', e => console.log(ele.id + " pointerup"))
ele.addEventListener('click', e => console.log(ele.id + " click"))
})
function dragHandler(e){
// handling drag move event
console.log('move')
}
parent1.addEventListener('pointerdown', (e) => {
e.target.setPointerCapture(e.pointerId)
e.target.addEventListener('mousemove', dragHandler)
e.target.onlostpointercapture = (e) => {
e.currentTarget.removeEventListener('mousemove', dragHandler)
e.currentTarget.onlostpointercapture = null
}
})
<div id='parent1' class='log'><div id='child1' class='log'>click me</div></div>
It seems that a pointer capture set on the parent element do prevent mouseup events from being fired on the child element, so I need to set the pointer capture on the child element (target
) instead of the parent element (currentTarget
).
The mouseup event of the parent element can be triggered normally through the bubbling.