iframe中嵌套threejs使用TrackballControls时touch事件报错
iframe中嵌套threejs使用TrackballControls时touch事件报错
作者:咕魂
时间:2021年8月3日
项目背景:在使用threejs引擎进行游戏开发时,使用iframe嵌套解决bgm在不同页面连续播放的问题,但是iframe中的onPointerDown事件会触发两次导致position出现两个元素无法使用
解决办法:修改TrackballControls的源码中的addPointer函数
原始函数:
function addPointer(event) {
_pointers.push(event)
}
修改后:
function addPointer(event) {
if (_pointers.length == 1) {
return
}
_pointers.push(event)
}
作用:拦截掉一次多余的事件
总结:该方法是在TrackballControls的源码中进行修改,不太推荐,如果有其他拦截iframe多次touch事件的方法欢迎指正
时间:2021年8月5日
之前的修改方法只能使模型旋转生效。但是缩放和平移会出现新的问题,这是之后的修改方案。
修改原理:移动端触发pointerdown和pointercancel时会触发两次,输出event对象查看属性,发现一次是mouse触发的,一次是touch触发的,添加一个判定条件,拦截掉移动端的mouse事件。
新增一个设备标记,来判断这是移动端设备还是pc端设备,该行代码需要加在onPointerDown之前,可以放在class代码内部的最前面。
this.mobile = /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)
在onPointerDown,onPointerMove和onPointerUp中添加设备判断代码:
//判断设备
if (scope.mobile && event.pointerType === 'mouse') {
return
}
添加后代码如下:
this.mobile = /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)
function onPointerDown(event) {
if (scope.enabled === false) return
if (_pointers.length === 0) {
scope.domElement.ownerDocument.addEventListener('pointermove', onPointerMove)
scope.domElement.ownerDocument.addEventListener('pointerup', onPointerUp)
} //
//判断设备
if (scope.mobile && event.pointerType === 'mouse') {
return
}
addPointer(event)
if (event.pointerType === 'touch') {
onTouchStart(event)
} else {
onMouseDown(event)
}
}
function onPointerMove(event) {
if (scope.enabled === false) return
//判断设备
if (scope.mobile && event.pointerType === 'mouse') {
return
}
if (event.pointerType === 'touch') {
onTouchMove(event)
} else {
onMouseMove(event)
}
}
function onPointerUp(event) {
if (scope.enabled === false) return
//判断设备
if (scope.mobile && event.pointerType === 'mouse') {
return
}
if (event.pointerType === 'touch') {
onTouchEnd(event)
} else {
onMouseUp()
} //
removePointer(event)
if (_pointers.length === 0) {
scope.domElement.ownerDocument.removeEventListener('pointermove', onPointerMove)
scope.domElement.ownerDocument.removeEventListener('pointerup', onPointerUp)
}
}
iframe中嵌套threejs使用TrackballControls时touch事件报错的更多相关文章
- 在action中进行文件下载,下载时运行不报错,可是也不下载
在写前端下载页面时,使用ajax方式调用action中的方法,然后就将下载内容返回js中了,所以没有下载,之后改为使用Windows.location进行下载,就没有问题了. action中代码: i ...
- soamanager发布的Webservice服务,调用时出现http500报错
最近再给薪酬那边发布ws服务时出现了报错,调用方反馈了errorCode:BEA-380002.在使用XMLspy工具去调用这个WSDL时候,则反馈http500的错误消息.如下图: 遇到这种问题我通 ...
- 擦他丫的,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了!
擦 ,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了! 问题在于我使用的谷歌浏览器,默认使用了缓存,导致每次访问同一个url时,都返回的是缓存里面的东西.通过谷歌 ...
- python3写入文件时编码问题报错
在字符串写入文件时,有时会因编码问题导致无法写入,可在open方法中指定encoding参数 chfile = open(filename, 'w', encoding='utf-8') 这样可解决大 ...
- laravel中ubuntu下执行php artisan migrate总是报错
ubuntu14.0 + xampp + laravel5下 laravel中ubuntu下执行php artisan migrate总是报错: [PDOException] could not fi ...
- Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法
转: Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法 更新时间:2018年02月14日 17:13:03 投稿:wdc 我要评论 Java开发中 ...
- 当子查询内存在ORDER BY 字句时查询会报错
问题:当子查询内存在ORDER BY 字句时查询会报错 SQL: SELECT * FROM ( SELECT * FROM USER ORDER BY USER_CORD ) S. 解决办法:在子查 ...
- 连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的,
连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的, 2018-03-12 17:08:52.532DEBUG[localhost-startStop-1]o.s.beans.factor ...
- 关于使用CodeFirst,修改类或上下文时操作数据库报错解决方法
在操作已经创建好的数据库时,若是添加新的实体类或者修改原有数据库上下文,会报如下错误: The model backing the 'StudentDbContext' context has cha ...
- nuget包管理nuget服务器发布包时出现请求报错 406 (Not Acceptable)
在window服务器上部署nuget服务器时,发布包时出现请求报错 406 (Not Acceptable) 验证用户名.密码正确的情况下,还是出现上面错误.后面跟踪服务器日志,发现window\te ...
随机推荐
- 信息资源管理文字题之“IT服务管理的理念以及ITIL管理体系中IT服务十大核心流程”
一.阐述IT服务管理的理念以及ITIL(信息技术基础架构库)管理体系中IT服务十大核心流程 二.答案 答:IT服务管理的理念是:以流程为导向,以客户为中心 ITIL标准中归纳了两大类核心流程:服务支持 ...
- HarmonyOS NEXT实战:高仿墨迹天气开发手记(附源码)
老余说3月份的神秘产品是为纯血鸿蒙而生的一款全新形态的手机,别人想象不到的手机产品,这次的保密工作真是非常到位,让人十分期待. 闲言少叙,今天为大家分享新年的第一个实战项目,高仿墨迹天气 这个项目中有 ...
- 鸿蒙运动开发实战:打造 Keep 式轨迹播放效果
前言 在运动类应用中,轨迹播放效果是提升用户体验的关键功能之一.它不仅能直观展示用户的运动路线,还能通过动态效果增强运动的趣味性.Keep 作为一款知名的运动健身应用,其轨迹播放效果深受用户喜爱.那么 ...
- L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制
一.为什么需要 Prompt 模板? 在与 AI 模型交互时,我们经常会遇到输出不稳定.格式混乱的问题.Prompt 模板帮助我们解决这些问题,通过结构化的输入指令来获得可预测且一致的输出结果. 模板 ...
- sqlite:No module named _sqlite3
执行代码报错:"sqlite:No module named _sqlite3" 执行环境说明 某台服务器上执行DrissionPage相关程序报错,本机没有问题. 解决说明 本机 ...
- JuiceFS介绍
简单介绍 JuiceFS 是一款面向云原生设计的高性能分布式文件系统,在 Apache 2.0 开源协议下发布.提供完备的 POSIX 兼容性,可将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同 ...
- Arduino 74HC164 数显屏幕显示简单程序
根据卖家的代码,翻译成arduino语言就是这样了,废话少说直接放函数 接口:DAT------11号数字输出接口 CLK------12号数字输出接口 代码在下面: typedef unsigned ...
- ChunJun支持异构数据源DDL转换与自动执行 丨DTMO 02期回顾(内含课程回放+课件)
导读: 4月26日晚,ChunJun项目核心成员.袋鼠云数栈大数据引擎开发专家渡劫为大家带来分享<ChunJun支持异构数据源DDL转换与自动执行>,我们将直播精华部分做了整理,带大家再次 ...
- 渗透中的逆向工具-jsrpc实操手记
前言 在渗透测试过程中,有些网站的接口参数是加密的.对于逆向小菜鸡的我来说,遇到这种网站总是束手无策,不能修改其中的参数,也就无法进行下一步的测试.偶然间发现一款js逆向工具jsrpc,它可以直接调用 ...
- MySQL索引完全指南:让你的查询速度飞起来
MySQL索引完全指南:让你的查询速度飞起来 还在为数据库查询慢而头疼吗?一个简单的索引就能让你的查询速度提升几十倍甚至上百倍!今天我将用最通俗易懂的方式,带你彻底搞懂MySQL索引的奥秘.从什么是索 ...