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事件报错的更多相关文章

  1. 在action中进行文件下载,下载时运行不报错,可是也不下载

    在写前端下载页面时,使用ajax方式调用action中的方法,然后就将下载内容返回js中了,所以没有下载,之后改为使用Windows.location进行下载,就没有问题了. action中代码: i ...

  2. soamanager发布的Webservice服务,调用时出现http500报错

    最近再给薪酬那边发布ws服务时出现了报错,调用方反馈了errorCode:BEA-380002.在使用XMLspy工具去调用这个WSDL时候,则反馈http500的错误消息.如下图: 遇到这种问题我通 ...

  3. 擦他丫的,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了!

    擦 ,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了! 问题在于我使用的谷歌浏览器,默认使用了缓存,导致每次访问同一个url时,都返回的是缓存里面的东西.通过谷歌 ...

  4. python3写入文件时编码问题报错

    在字符串写入文件时,有时会因编码问题导致无法写入,可在open方法中指定encoding参数 chfile = open(filename, 'w', encoding='utf-8') 这样可解决大 ...

  5. laravel中ubuntu下执行php artisan migrate总是报错

    ubuntu14.0 + xampp + laravel5下 laravel中ubuntu下执行php artisan migrate总是报错: [PDOException] could not fi ...

  6. Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法

    转: Eclipse中引入com.sun.image.codec.jpeg包报错的完美解决办法  更新时间:2018年02月14日 17:13:03   投稿:wdc   我要评论   Java开发中 ...

  7. 当子查询内存在ORDER BY 字句时查询会报错

    问题:当子查询内存在ORDER BY 字句时查询会报错 SQL: SELECT * FROM ( SELECT * FROM USER ORDER BY USER_CORD ) S. 解决办法:在子查 ...

  8. 连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的,

    连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的, 2018-03-12 17:08:52.532DEBUG[localhost-startStop-1]o.s.beans.factor ...

  9. 关于使用CodeFirst,修改类或上下文时操作数据库报错解决方法

    在操作已经创建好的数据库时,若是添加新的实体类或者修改原有数据库上下文,会报如下错误: The model backing the 'StudentDbContext' context has cha ...

  10. nuget包管理nuget服务器发布包时出现请求报错 406 (Not Acceptable)

    在window服务器上部署nuget服务器时,发布包时出现请求报错 406 (Not Acceptable) 验证用户名.密码正确的情况下,还是出现上面错误.后面跟踪服务器日志,发现window\te ...

随机推荐

  1. 信息资源管理文字题之“IT服务管理的理念以及ITIL管理体系中IT服务十大核心流程”

    一.阐述IT服务管理的理念以及ITIL(信息技术基础架构库)管理体系中IT服务十大核心流程 二.答案 答:IT服务管理的理念是:以流程为导向,以客户为中心 ITIL标准中归纳了两大类核心流程:服务支持 ...

  2. HarmonyOS NEXT实战:高仿墨迹天气开发手记(附源码)

    老余说3月份的神秘产品是为纯血鸿蒙而生的一款全新形态的手机,别人想象不到的手机产品,这次的保密工作真是非常到位,让人十分期待. 闲言少叙,今天为大家分享新年的第一个实战项目,高仿墨迹天气 这个项目中有 ...

  3. 鸿蒙运动开发实战:打造 Keep 式轨迹播放效果

    前言 在运动类应用中,轨迹播放效果是提升用户体验的关键功能之一.它不仅能直观展示用户的运动路线,还能通过动态效果增强运动的趣味性.Keep 作为一款知名的运动健身应用,其轨迹播放效果深受用户喜爱.那么 ...

  4. L2-1、打造稳定可控的 AI 输出 —— Prompt 模板与格式控制

    一.为什么需要 Prompt 模板? 在与 AI 模型交互时,我们经常会遇到输出不稳定.格式混乱的问题.Prompt 模板帮助我们解决这些问题,通过结构化的输入指令来获得可预测且一致的输出结果. 模板 ...

  5. sqlite:No module named _sqlite3

    执行代码报错:"sqlite:No module named _sqlite3" 执行环境说明 某台服务器上执行DrissionPage相关程序报错,本机没有问题. 解决说明 本机 ...

  6. JuiceFS介绍

    简单介绍 JuiceFS 是一款面向云原生设计的高性能分布式文件系统,在 Apache 2.0 开源协议下发布.提供完备的 POSIX 兼容性,可将几乎所有对象存储接入本地作为海量本地磁盘使用,亦可同 ...

  7. Arduino 74HC164 数显屏幕显示简单程序

    根据卖家的代码,翻译成arduino语言就是这样了,废话少说直接放函数 接口:DAT------11号数字输出接口 CLK------12号数字输出接口 代码在下面: typedef unsigned ...

  8. ChunJun支持异构数据源DDL转换与自动执行 丨DTMO 02期回顾(内含课程回放+课件)

    导读: 4月26日晚,ChunJun项目核心成员.袋鼠云数栈大数据引擎开发专家渡劫为大家带来分享<ChunJun支持异构数据源DDL转换与自动执行>,我们将直播精华部分做了整理,带大家再次 ...

  9. 渗透中的逆向工具-jsrpc实操手记

    前言 在渗透测试过程中,有些网站的接口参数是加密的.对于逆向小菜鸡的我来说,遇到这种网站总是束手无策,不能修改其中的参数,也就无法进行下一步的测试.偶然间发现一款js逆向工具jsrpc,它可以直接调用 ...

  10. MySQL索引完全指南:让你的查询速度飞起来

    MySQL索引完全指南:让你的查询速度飞起来 还在为数据库查询慢而头疼吗?一个简单的索引就能让你的查询速度提升几十倍甚至上百倍!今天我将用最通俗易懂的方式,带你彻底搞懂MySQL索引的奥秘.从什么是索 ...