我有一个水平旋转木马,我正在使用touchstart,touchmove,touchend来控制它。为了这个例子,html结构类似于:
<div>
<ul id="strip">
<li><a>...</a></li>
<li><a>...</a></li>
...................
</ul>
</div>
我已经将我的事件处理程序分开,从鼠标到触摸事件的行为有点不同,因此,只考虑触摸,我有:
var strip = document.getElementById('strip');
strip.addEventListener('touchstart', touchStartHandler);
document.addEventListener('touchmove', touchMoveHandler);
document.addEventListener('touchend', touchEndHandler);
即使用户的手指在我的条带外面,我希望水平滚动也能正常工作,所以我将touchmove和touchend事件附加到文档中。
起初,我认为当用户滚动我的旋转木马时,浏览器保持不变是很自然的,所以我的touchMoveHandler看起来像是:
function touchMoveHandler(evt){
evt.preventDefault();
...................
}
...这样,当用户的手指在Y轴上变化时,浏览器不会垂直平移。我们的可用性人,不这么认为,我现在真的同意他的看法。他希望浏览器能够正常响应,除非手指的移动完全或接近完全水平。 无论如何,这可能是太多的信息,所以我现在要详细说明我的实际问题。这是我正在研究的原型的片段作为概念证明:
var stopY, lastTime, newTime;
var touchStartHandler(evt){
...
stopY = true;
lastTime = new Date();
...
};
var touchMoveHandler(evt){
...
//this following code works like a setInterval, it turns stopY on and off every 1/2 sec
//for some reason, setInterval doesn't play well inside a touchmove event
newTime = new Date();
if(newTime - lastTime >= 500){
stopY = !stopY;
lastTime = newTime;
}
...
if(stopY){
evt.preventDefault();
}
...
}
我绝对相信这段代码是原始的,我用控制台日志调试它,一切都在做它应该做的事情,除了通过stopY变量浏览器平移的通勤。 如果我运行以stopY = true开头的代码,则没有浏览器平移,如果我以stopY = false开头,浏览器按预期平移。问题是,我希望这种行为每半秒改变一次,但事实并非如此。
我希望我没有为你太复杂,但这是非常具体的。
感谢您的时间和帮助
您可以尝试以下链接(在Ipad或Iphone上):
http://andrepadez.com/ipadtouch
http://andrepadez.com/ipadtouch?stopy=false
使用视图源,查看整个代码
答案 0 :(得分:1)
你能试试stopY = !stopY;
吗?
<强>更新强>
执行preventDefault()
后,在touchend
触发或启用之前,滚动将无法返回。以下内容可能会为您提供所需的行为:
if(stopY){ return false; }
else { return true; }
或简单起见return !stopY;
...