我有一个div(#parent(,里面有4个子元素。 这个想法是,当我触摸<跨度>元素之一并移动手指时,我会触发事件(触摸移动(,当我将手指移动到当前<跨度之外时>(同时仍然按下(事件应该停止。跨度之外时>跨度>
我试图通过检查我是否触及跨度>或其他元素来获得这项工作<但没有运气。一旦我按下并移动,我无法在松开手指之前停止事件。>
document.querySelector("#parent").addEventListener('touchmove', (e) => {
console.log(`pressed ${e.target.getAttribute('data-dir')}`)
});
<div id="parent">
<span data-dir="3">↑</span>
<span data-dir="0">→</span>
<span data-dir="1">↓</span>
<span data-dir="2">←</span>
</div>
- 首先,您可以使用
document.elementFromPoint()
API 来判断您的手指是在<span>
内部还是外部。 - 然后,您可以通过
removeEventListener
来停止事件。在移动过程中,如果手指在<span>
之外,只需移除听者即可。
喜欢这个:
const $el = document.querySelector("#parent")
$el.addEventListener('touchstart', function startHandler(e) {
$el.addEventListener('touchmove', function moveHandler(e) {
if (document.elementFromPoint(e.touches[0].clientX, e.touches[0].clientY).tagName !== 'SPAN') {
$el.removeEventListener('touchmove', moveHandler)
}) else {
// do your things
}
});
$el.addEventListener('touchend', function endHandler(e){
// remove the listeners to avoid mutiple listeners
$el.removeEventListener('touchstart', startHandler)
$el.removeEventListener('touchmove', moveHandler)
$el.removeEventListener('touchend', endHandler)
})
})