节前在支援一些移动页面的时候,遇到了蛮多的TouchEvent相关的问题,趁着假期一一验证一下。
首先,一个简单的html页面如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>TouchEvent - Document Scrolling</title>
<style>
#container{height: 2000px;}
#demo2 #container{
position: absolute;
height: 100%;
overflow-y: auto;
}
#demo2 .content{
height: 2000px;
}
</style>
</head>
<body id="demo2">
<div id="container">
<h1>容器</h1>
<h2>捕捉、冒泡</h2>
<p class="content">测试touchEvent</p>
</div>
</body>
</html>
<script>
document.getElementById('container').addEventListener('touchstart', touchstartHandler, false);
document.body.addEventListener('touchstart', touchstartHandler, false);
function touchstartHandler (e) {
console.log('currentTarget: ' + e.currentTarget + '@' + new Date().getTime());
}
</script>
当addEventListener的最后一个参数为false的时候,为冒泡模式,当最后一个参数为true的时候,为捕捉模式。
两个模式都试一下,从console中可以看出,TouchEvent是支持冒泡和捕捉的。截图是冒泡模式。
function touchstartHandler (e) {
e.preventDefault();// 可以阻止document的滚动发生
e.stopPropagation();// 可以阻止冒泡
console.log('currentTarget: ' + e.currentTarget + '@' + new Date().getTime());
}
结果也是TouchEvent可以阻止冒泡的。
正常情况下面的滚动,是发生在body上面,可以通过document.body.scrollTop获得滚动的距离。
而DIV的滚动,则是发生在某个div上面,需要通过currentTarget.scrollTop来获得
<script>
document.getElementById('container').addEventListener('touchstart', touchstartHandler, false);
document.body.addEventListener('touchstart', touchstartHandler, false);
function touchstartHandler (e) {
console.log('currentTarget: ' + e.currentTarget + '@' + new Date().getTime());
console.log('body scrollTop:' + document.body.scrollTop);
console.log('div scrollTop:' + e.currentTarget.scrollTop);
}
</script>