Threejs軌道控制器(OrbitControls)對touchmove事件的攔截


Threejs的軌道控制器(OrbitControls)對touchmove冒泡事件的攔截

作者:咕魂

時間:2021年7月18日

問題描述:

創建控制器的方法:

new THREE.OrbitControls(camera, renderer.domElement) //創建控件對象

添加touch相關的事件監聽函數

document.addEventListener('touchstart', onTouchStart)
document.addEventListener('touchmove', onTouchMove)
document.addEventListener('touchend', onTouchEnd)
function onTouchStart(event){...}
function onTouchMove(event){...}
function onTouchEnd(event){...}

此時document的事件函數是renderer.domElement的父級

查看OrbitControls.js的源碼

找到onTouchMove(event)函數

往下找兩行可以看到

event.preventDefault()
event.stopPropagation()

其中stopPropagation()會對冒泡事件進行攔截,即上文中通過對document對象添加監聽函數會無法觸發

解決辦法:

直接改OrbitControls.js的源碼,注釋掉event.stopPropagation()

但一般不會這么做,畢竟這是人家官方給的

還有一個方法就是監聽事件不要掛載在document上,和OrbitControls.js中的onTouchMove(event)一樣,掛載到renderer.domElement上,即:

document.addEventListener('touchstart', onTouchStart)
renderer.domElement.addEventListener('touchmove', onTouchMove)
document.addEventListener('touchend', onTouchEnd)

之后就可以觸發onTouchMove函數了

應用項目:3D掃雷

參考鏈接:js中的preventDefault與stopPropagation詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM