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详解

Threejs轨道控制器(OrbitControls)对touchmove事件的拦截的更多相关文章

  1. three.js轨道控制器OrbitControls.js

    https://blog.csdn.net/qq_37338983/article/details/78575333 文章地址

  2. 实现html元素跟随touchmove事件的event.touches[0].clientX移动

    主要是使用了transform:translateX 实现 <!DOCTYPE html> <html lang="en"> <head> &l ...

  3. 关于如何获取移动端 touchmove 事件中真正触摸点下方的元素

    移动端的touchstart, touchmove, touchend三个事件,点击元素并拖动时,获取到了touchmove事件, 但是event.touches[0].target所指向的元素却是t ...

  4. H5页面开发的touchmove事件

    在做一屏滚动的H5页面的时候,必须移除touchmove事件,如果不移除,在安卓机上会触发微信原生的向下滚动拉出刷新.在IOS上出现上下都可以继续滑动,所以需要移除document的touchmove ...

  5. Taurus.MVC WebAPI 入门开发教程6:全局控制器DefaultController与全局事件。

    系列目录 1.Taurus.MVC WebAPI  入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...

  6. android 事件反拦截

    有一种方法可以阻止父层的View截获touch事件,就是调用 getParent().requestDisallowInterceptTouchEvent(true);方法.一旦底层View收到tou ...

  7. android view、viewgroup 事件响应拦截处理机制

    文章中会用到部分网络资源,首先将原作者的链接附上. 但是还是会附上数量较大的关于此部分内容的自己的思考. ----------------------------------------------- ...

  8. 移动端touchstart、touchmove事件的基本使用

    在pc端,我们通常使用$(window).scroll()事件来监听元素的位置,来做一些入场动效,如: $(window).scroll(function(){ var panel3Move = do ...

  9. angularjs控制器之间通信,事件通知服务

    service要记住一点就是所有的services都是singleton(单例)的,service更多的是做一些业务逻辑,数据交互.当然,利用单例这特点也可以用来做不同控制器间的通信.控制器间的通信也 ...

  10. threejs Object的点击(鼠标)事件(获取点击事件的object)

    objects=[]; raycaster = new THREE.Raycaster(); mouse = new THREE.Vector2(); //监听全局点击事件,通过ray检测选中哪一个o ...

随机推荐

  1. Axure在线教育考试原型图在线网课教育交互模板rp源文件

    Axure在线教育考试原型图在线网课教育交互模板rp源文件 Axure在线教育原型图在线网课教育交互模板rp源文件是一款原创的儿童教育类的APP模板,使用axure rp软件制作.app中包含大约40 ...

  2. vue3 基础-生命周期函数

    在 vue 中, 生命周期函数可理解为 "在某个时刻, 会自动执行的函数". 先直观感受一下图示. 一共就八个: <!DOCTYPE html> <html la ...

  3. TensorFlow 基础 (04)

    最近都面临一个问题是, 要用纯 sql 来实现所有的逻辑, 其实 union 呀, 嵌套, 子查询呀, 这些都还好, 但那带有逻辑判断的, 这就整不好整了, 就多分支的, 再分支这种... 也不知为啥 ...

  4. 【SQL周周练】一千条数据需要做一天,怎么用 SQL 处理电表数据(如何动态构造自然月)

    大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第 6 篇,也是[SQL 周周练]系列的第 5 篇.该系列是挑选或 ...

  5. MethodImpl优化性能

    参数解释 MethodImplOptions.AggressiveInlining:请求编译器在可能的情况下对方法进行内联. MethodImpl:这是一个属性,允许开发者为方法指定特定的实现行为,比 ...

  6. WPF中Resx文件中添加Byte[]

    参考:https://learn.microsoft.com/zh-tw/dotnet/api/system.resources.resxresourcewriter.generate?view=wi ...

  7. C# system.Threading.Timer和system.Timers中的定时器

    它们都可以用于在指定时间间隔后执行代码.然而,它们在实现和用法上有一些差异. System.Threading.Timer: System.Threading.Timer 是基于线程的定时器,它属于 ...

  8. 使用Spring AOP 和自定义注解统一API返回值格式

    摘要:统一接口返回值格式后,可以提高项目组前后端的产出比,降低沟通成本.因此,在借鉴前人处理方法的基础上,通过分析资料,探索建立了一套使用Spring AOP和自定义注解无侵入式地统一返回数据格式的方 ...

  9. 基于TCP实现简单的聊天室

    原文出处:<Go 语言编程之旅>第四章4.1节 基于TCP的聊天室 1.服务端 新用户到来,生成一个User的实例,代表该用户. type User struct{ ID int // 用 ...

  10. 从理解AI到驾驭文字:一位技术爱好者的写作工具探索手记

    三年前,当我第一次接触AI写作工具时,它生成的文字还带着明显的机械感,段落间的逻辑时断时续.如今,这些系统已经能写出颇具文采的散文,甚至模仿特定作家的风格.这种进化轨迹恰好为学习者提供了一个观察AI发 ...