- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个 HTML5 Canvas 项目,在为移动设备添加多点触控支持时,我似乎在 iOS 7.1 中的 Mobile Safari 上遇到了问题。
用户与我的应用程序交互的主要方式是通过单击和拖动。在桌面上,我将适当的鼠标事件监听器添加到我的 Canvas 中...
c.addEventListener('mousedown', mouseDown, false);
c.addEventListener('mousemove', mouseMoved, false);
c.addEventListener('mouseup', mouseUp, false);
...让这些事件处理程序计算鼠标位置并调用一个更通用的函数,该函数仅接受事件的 X 和 Y 位置...
function mouseDown(evt)
{
var pos = getMousePos(evt);
inputDown(pos);
}
function mouseUp(evt)
{
var pos = getMousePos(evt);
inputUp(pos);
}
function mouseMoved(evt)
{
var pos = getMousePos(evt);
inputMoved(pos);
}
function getMousePos(evt)
{
var rect = c.getBoundingClientRect();
return { 'x': evt.clientX - rect.left, 'y': evt.clientY - rect.top }
}
...一切都很好。我设计这种抽象级别是为了方便扩展到其他输入方法。所以现在我尝试使用 Touch API 来扩展它。首先,我将处理程序添加到 Canvas 上鼠标处理程序旁边...
c.addEventListener("touchstart", touchDown, false);
c.addEventListener("touchmove", touchMoved, false);
c.addEventListener("touchend", touchUp, false);
c.addEventListener("touchcancel", touchUp, false);
...然后添加我的瘦事件处理程序来抽象触摸事件...
function touchDown(evt)
{
evt.preventDefault();
// Ignore touches after the first.
if (activeTouch != null)
return;
if (evt.changedTouches.length > 0)
{
activeTouch = evt.changedTouches[0].identifier;
var pos = getTouchPos(evt);
inputDown(pos);
}
}
function touchUp(evt)
{
var pos = getTouchPos(evt);
activeTouch = null;
inputUp(pos);
}
function touchMoved(evt)
{
var pos = getTouchPos(evt);
inputMoved(pos);
}
function getTouchPos(evt)
{
var canX = 0;
var canY = 0;
for( var i = 0; i < evt.touches.length; i++ )
{
if (evt.touches[i].identifier == activeTouch)
{
canX = evt.touches[i].pageX - c.offsetLeft;
canY = evt.touches[i].pageY - c.offsetTop;
break;
}
}
return { 'x': canX, 'y': canY }
}
...这就是我遇到麻烦的地方!你可以看到事情变得有点棘手,但撇开效率低下不谈,我认为我正确地使用了一切。问题是 getTouchPos(evt)
似乎无法获取 touchstart
上触摸的正确 X、Y 位置。第一次触摸时,我得到的位置是 0,0。如果我拖动手指,touchmove
会触发多次,并且报告的 X、Y 坐标看起来不错。如果我抬起手指,touchend
就会触发,我也会得到正确的位置。但是,如果我再次触摸,touchstart
会触发,而不是我正在触摸的位置,我会得到上次触摸结束位置的 X,Y 坐标!
我已经使用调试器进行了调试,果然,陈旧/未初始化的值就在我在事件数据中获得的 Touch 对象中。我做错了什么吗?我不明白为什么我似乎从 touchstart
事件中获得了错误的坐标。我可以做什么来解决这个问题?我可以使用其他来源来获得正确的位置吗?对事件顺序进行微妙的调整?
Here's a link to an online demo of the full code if you'd like to run some in-browser debug.
提前感谢您的帮助。
最佳答案
我不确定这是否显而易见,但这是一个调试起来很有趣的问题。所以基本上,困惑归结于这个人:
function mouseMoved(evt) {
var pos = getMousePos(evt);
inputMoved(pos);
}
对于您的鼠标事件,一切都很好,因为您必须绑定(bind)到 mousemove
。
c.addEventListener('mousemove', mouseMoved, false);
哪个调用
function mouseMoved(evt) {
var pos = getMousePos(evt);
inputMoved(pos);
}
因此,当您移动鼠标时,您的 posX/posY
值会不断更新。 (希望您现在就看到这个问题了:)
对于 TouchEvents,当用户触摸(但不移动)时,您只会触发 touchstart
和 touchend
。直到用户拖动时,touchmove
才会被调用,进而调用函数 touchMoved
(调用 inputMoved
- 更新您的posX/posY
值)。
在您的页面上解决此问题的最简单方法就是在 touchstart
和 touchmove
中调用 inputMoved
,以便您的 MassHaver
实例具有最新状态。
关于javascript - 触摸事件 "touchstart"在 Mobile Safari 上返回错误位置。解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23586944/
我目前正在我的设备 (Samsung galaxy S2) 上为我的游戏测试触摸启动功能。我在 android 中使用封装在 phonegap 下的 javascript 和 jquery 进行编程,
我用过这个link在我的项目中向左/向右写入的 stackoverflow 的内容,但现在我希望每次滑动 1 秒后处于非事件 touchstart 状态,并在 1 秒后 touchstart 处于事件
Angular 触控 ngTouch导致在触摸释放时发生点击。 有没有办法让点击发生在触摸开始? fast-click下面的指令似乎可以在触摸屏上执行我想要的操作,但它不适用于鼠标点击。 myApp.
如果您使用以下语法,一个简单的 touchstart 事件就可以工作: http://jsfiddle.net/rwdu4hb9/ $(function(){ $('.test').on('t
由于大多数桌面浏览器尚不支持 touchstart/touchend。如何创建与 mousedown 事件相同的 touchstart 事件(所有浏览器都支持)。 我想要这样的东西 $('obj').
我想在用户向下滚动移动设备页面时禁用 touchstart 事件。该页面有各种元素,当您单击时会切换一个类,但我希望当用户向下滑动以向下滚动页面时禁用这些 touchstart 事件。 JQUERY
所以我正在使用 JQuery (1.11.3),但我一直被困在网上找不到任何东西的东西上。 基本上,我将一个处理程序绑定(bind)到“touchstart”事件并想要检索触摸事件的位置。 (注意:我
我已将 touchstart 事件附加到网络应用程序中固定位置的页脚 所以结构是这样的: i am a looong content. i am tappable! 代码如下: $("#footer"
我倾向于制作一个输入字段和一个适用于移动浏览器的按钮。当我在字段中输入 123 并单击按钮时,它应该转到 http://example.com/123.html 然后我将这两个线程结合起来 24266
我将 Seadragon Ajax 与 jQuery 触摸事件监听器结合使用。 容器绑定(bind)了 touchstart、touchmove 和 touchend,这里是 touch start:
我已尝试在我的代码中进行滑动操作,但 touchstart 未初始化。我尝试在 stackoverflow 中搜索解决方案,但找不到任何解决方案。我是使用js的新手。这是链接: Sample wind
我正在将 Chrome 应用程序转换为 Electron 。该应用程序本身以全屏信息亭模式运行提供的 URL(带有一些其他配置选项)。我希望能够在 webview 的父元素上检测渲染器进程中的点击,但
今天突然之间,我开始在我们网站的每个页面上看到这个 Added non-passive event listener to a scroll-blocking 'touchstart' event.
我想阻止 touchStart 事件,以防止 Safari 在某些条件下在 iOS 设备中弹出。 为此,我使用以下方法: $('.wrapper').on('touchstart', function
我在页面上有一系列 div,您可以向左滑动,这将显示下面的 div。当只有一个元素时,这种方法效果很好,但当有多个元素时,它们都会一致滑动,而不是单独滑动一个。 为了解决这个问题,我尝试了这里的想法:
有与此类似的问题,但解决方案要么涉及另一个库,要么改用点击事件 - 我想知道没有库是否可行。 我在图像上使用 touchstart 事件来检测 1.5 秒的点击,然后重新加载所述图像。然而,在大多数移
我想在我的 li 上添加 touchstart 事件,而不禁用父级上的滚动。 目前,它有效。我在 timeline 上有滚动条,我可以点击 li。 当我添加touchstart时,我可以点击其中一个l
我在触摸启动后播放一些音频时遇到问题。我有以下在 Chrome 57 中运行的代码: Play Media on user touch Click me to play audio! d
更新:这个问题发生在动态创建的元素上我有一个页面,我在其中将 ajax 中的产品加载到网格中。每个产品都是一个 div,我希望可以单击它以将其信息添加到购物车。 使用 Jquery click 事件一
我正在寻找适用于 iOS 的解决方案,例如悬停在“桌面世界”中。我的页面上有很多图像项目,当用户在图像上移动手指时,实际图像的不透明度为 0。(因此一次移动会隐藏所有项目:) ) 我尝试过这样的事情:
我是一名优秀的程序员,十分优秀!