在这几天工作中有遇到这么个问题:使用threeJS创建了一个3d效果图,且在该项目中使用了threeJs的轨道控制插件orbitcontrols插件,该效果图需要运行在移动端浏览器中,既然是运行移动端,自然需要用到触摸功能了,在我们常见的3d图中,有能旋转的功能,平移的功能,之间自己还没接触threeJS的时候,还常常在想,这些是怎么做到的啊,觉得灰常的炫酷。
在这个项目中,有这么一个需求,当我们平移场景的时候,在左侧有个导航栏,该导航栏是用于显示各个物体详情的一个索引(threeJs中有通过Raycaster这个对象来实现物体拾取功能,在这个项目中,我以浏览器中心为点击点,这样从摄像机到浏览器中心就有了一线段,这样线段与场景中的物体有一系列的交集,就可以获取到我们想要的物体了:ps物体拾取的大致思路是这样的),在pc端经过自己不断的调试后,能实现该效果,但是在移动端浏览器的时候,通过自定义滑动事件,发现效果并不是我们想象中的那样,因为自定义的滑动事件失效了,what fuck!!!,多么悲伤的故事。但是本人一直相信一句话,问题和方法是并存的,既然问题出现了,那么一定有解决方法的,所以在经过本人的多番查看下,最后发现了问题所在:在threeJs的轨道控制插件orbitcontrols中,是给绘制到页面上的canvas绑定的滑动事件,而且在滑动事件中,阻止了事件冒泡,源码如下所示:
而自己在自定义滑动事件的时候,是给document通过addEventListener绑定的事件,我们都知道,该方法 addEventListener(eventType,function,boolean)第三个参数是用于设置事件是否捕获,所以当时自己将该参数设置为false,即采用事件冒泡了。现在大家可以想象下,后果会是咋样了吧,canvas是document的子节点,而在给canvas绑定滑动事件的时候,又阻止了事件冒泡。那么自然而然我自定义的滑动事件也就失效了,也行这个时候有人会问了,你在pc端使用鼠标移动的时候,为什么不会存在这个问题啊?很好,一开始我也有这个疑问,后面抱着学习的态度,查看了插件源码,源码中针对鼠标的移动事件,并没有阻止事件冒泡(吐槽下,不太明白这个源码的编者咋想的),不过没有阻止事件冒泡当然是好事了,嘿嘿
最后,对于上述问题,有两个解决办法,一个是自定义的滑动事件,采用事件捕获,另外一种就是修改orbitControls插件源码了,但是后面这种方法,如果贸然的修改源码的话,说不定会引起其他的不良反应,所以最后本人采用的是事件捕获了。由此可见,当使用一个插件的时候,最好的办法是先阅读我们使用的那个方法的源码,这样能少走弯路。
今天是元宵节,在这里祝愿各位元宵节快乐,做一个有深度的码农
相关推荐
在JavaScript开发中,事件冒泡是当一个元素接收到事件时,该事件不仅会在该元素上发生,还会向上传播到父元素,直至顶层文档对象。事件冒泡机制允许事件处理程序从最深的节点开始,逐级向上传播到根节点,这可以被...
7. **JS库和框架**:虽然标签中提到了"其他代码",但考虑到项目复杂性,可能使用了一些JavaScript库或框架,如GreenSock(GSAP)或Three.js,来简化动画的编写和管理。 8. **响应式设计**:由于是全屏背景动画,很...
开发者可能使用Three.js或glMatrix等库来简化WebGL编程,处理矩阵运算和渲染。 6. **图片变形算法**: 图片的自由拉伸和变形可能涉及到图像处理算法,如仿射变换、极坐标变换或者基于像素的扭曲算法。这些算法会...
JavaScript中的`fireEvent`方法是Internet Explorer浏览器特有的一个事件触发函数,它允许开发者模拟用户对DOM元素的操作,比如点击、提交等。与标准的事件处理方式不同,`fireEvent`在某些情况下能触发事件冒泡,...
9. **插件和框架**:除了基础的JavaScript知识,了解流行的特效库和框架如GreenSock Animation Platform (GSAP)、Three.js(3D绘图)和Vue.js(前端框架)等,可以大大扩展你的特效制作能力。 10. **跨浏览器兼容性...
5. **阻止事件冒泡和取消默认行为的统一方法**:这允许开发者能够轻松地控制事件的行为,例如阻止点击事件的默认行为等。 #### 三、绑定事件处理程序 - **bind() 方法** `bind()` 是 jQuery 中用于绑定事件处理...
Three.js等库可以帮助简化WebGL的开发,并提供跨浏览器兼容性。 4. **事件处理**: 在实现多浏览器支持时,事件处理也是关键。不同浏览器对事件模型的实现可能不同,例如IE的attachEvent与非IE浏览器的...
10. **动画库和框架**:如GreenSock (GSAP)、Three.js(3D图形)和Anime.js等,为开发者提供了强大的动画工具,能实现复杂的视觉特效。 11. **响应式设计**:随着设备多样性,JavaScript常用于实现响应式布局,根据...
在Vue.js框架中,父子组件之间的通信是应用开发中的常见需求。本文将深入探讨如何解决Vue父子模板间的传值问题,结合案例详细讲解其实现方法和步骤。 首先,我们需要了解Vue中父子组件通信的基本原理。在Vue中,父...
"3d"可能暗示课程包含了一些3D图形或者交互式的元素,这可能涉及到WebGL或Three.js等库,用于在浏览器中展示3D内容。UTN-FRA可能是教学机构的缩写,比如阿根廷的UTN(国立技术大学)的一个分校。 从压缩包文件...
5. **事件处理**:JavaScript通过事件监听、事件触发和事件冒泡来响应用户的交互,例如点击按钮、提交表单等。 6. **AJAX和Fetch API**:用于在不刷新整个页面的情况下与服务器进行异步数据交换,提高用户体验。 7...
8. **游戏开发框架**:如果项目涉及游戏开发,可能会介绍如何使用Three.js或Phaser等JavaScript游戏框架,这些框架简化了图形渲染和物理模拟等复杂任务。 9. **性能优化**:了解如何使用事件节流和防抖技术,以及...
9. **事件处理**:DOM事件、事件冒泡、事件委托。 10. **DOM操作**:选择元素(getElementById、querySelectorAll等)、添加/删除元素、修改元素属性。 11. **AJAX**:XMLHttpRequest对象、fetch API进行异步数据...
5. **事件处理**:事件监听、事件冒泡、事件委托。 6. **异步编程**:回调函数、Promise、async/await。 7. **模块化**:CommonJS(Node.js)、ES6模块(import/export)。 8. **错误处理**:try...catch语句、throw...
// 阻止事件冒泡,防止影响其他菜单项 var submenu = item.querySelector('ul'); // 获取当前菜单项的子菜单 if (submenu.style.display === 'none') { // 如果子菜单隐藏,则显示 submenu.style.display = '...
例如,当我们使用WebGL或Three.js创建3D图形时,就需要用到向量、矩阵、几何变换等数学知识。在数据可视化中,统计图表的生成、数据分布的分析等也依赖于数学方法。 在算法方面,JavaScript常常被用来实现各种排序...
3. 库与框架:JavaScript社区有许多优秀的库和框架,如D3.js、Three.js等,为算法可视化提供强大的图形渲染和数据操作支持。 三、项目结构与贡献 "algorithms"项目分为多个部分,每个部分对应一个或多个算法的可视...
7. **算法与数据结构**:挑战中可能会涉及常见的排序算法(冒泡、选择、插入、快速、归并等)、查找算法(线性、二分查找)以及栈、队列、链表、树等基本数据结构的实现和应用。 8. **网页动画和游戏开发**:利用...