doubleyong
管理员
管理员
  • 最后登录2025-10-08
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:3277回复:0

[其它]touch事件及穿透事件

楼主#
更多 发布于:2022-09-23 11:43
1. touch 事件的来历


2007 苹果推出iphone,浏览器网页在iphone上显示时字体特别小,根本看不清楚


苹果的解决方案:


方案一:双指进行缩放






方案二:在屏幕上双击进行放大(单击300ms后,再单击才算双击),造成了,移动端点击事件,300ms 延迟的问题


解决方案,就是使用touch事件来替代






移动端新增touch事件 --- 只能使用现代事件进行添加


    touchstart:  触摸开始


    touchmove: 触摸移动


    touchend: 触摸结束


    touchcancel:touch 取消,如来电等






【扩展】:移动端touch、click、tap的区别


http://t.zoukankan.com/luo1240465012-p-9450627.html






2. 添加touch 事件


代码如下:


<script type="text/javascript">
document.addEventListener('touchstart', function () {
console.log( 'touchstart' );
, false);
document.addEventListener( 'touchmove ', function () {
console.log( 'touchmove' );
}, false);
document.addEventListener( 'touchend ', function () {
console.log ( 'touchend ' );
}, false);
document.addEventListener( 'touchcancel', function () {
console.log( 'touchcancel');
, false);
setTimeout(function () {
    alert( 'blocked ' );  //使用alert 来模拟touchcancel 打断
, 3000);
</script>






3. touch对象


注:touchstart 触摸开始后,不管touchmove , touchend 是否移出开始触摸的元素,e.target都是开始时触摸的元素dom.


<script type="text/javascript">
document.addEventListener( 'touchstart', function (e) {
    console.log(e.target);
, false);
document.addEventListener( 'touchmove', function (e){
    console.log(e.target);
, false);
document.addEventListener( 'touchend ' , function (e){
    console.log(e.target);
, false);
</ script>




e.touches : 在手机上的所有触点信息


e.changeTouches: 跟当前事件相关的所有触点信息


e.targetTouches:作用在当前元素上的所有触点信息






【扩展】touch事件中的touches、targetTouches和changedTouches详解


https://www.cnblogs.com/mengff/p/6005516.html






4. 封装 touch 事件


<script type="text/javascript">
; (function (doc){
    var Touch = function (selector) {
        return Touch.prototype.init(selector);
    }
    Touch.prototype = {
        init: function (selector) {
            if (typeof(selector) 'string') {
                this.elem = doc.querySelector(selector);
                return this;
            }
        },
        tap: function (callback){
            this.elem.addEventListener( 'touchstart' , fn, false);
            this.elem.addEventListener( 'touchend ' , fn, false);
            var sTime,eTime;
            function fn (e){
                e.preventDefault();
                switch (e.type){
                    case 'touchstart' :
                        sTime = new Date().getTime();
                        break;
                    case 'touchend ':
                        eTime = new Date( ).getTime();
                        if(eTime - sTime < 500){
                            callback.call(this,e);
                        }
                        break;
                }
            }
        },
        longtap: function (callback){
            this.elem.addEventListener( 'touchstart' , fn,false);
            this.elem.addEventListener( 'touchmove', fn, false);
            this.elem.addEventListener( 'touchend ' , fn, false);
            var t = null,
                _self = this;
            function fn (e){
                switch (e.type){
                    case 'touchstart ' :
                        t = setTimeout( function () {
                            callback.call(_self, e);
                        },500);
                        break;
                    case 'touchmove' :
                        clearTimeout(t);
                        t = null;
                        break;
                    case 'touchend':
                        clearTimeout(t);
                        t = null;
                        break;
                }
            }
        }
        window.$ = window.Touch = Touch;
})(document);
</script>








事件测试:


$('#box' ).tap(function (e) {
    console. log(e.changedTouches[o]);
});
$('#box' ).longtap( function (e) {
    console.log(e);
);






5. touch 事件的穿透


因click是在touch系列事件发生后300ms才触发的,混用click和touch肯定会导致穿透问题.






点击穿透现象的情况:


1) 蒙层问题


蒙层的关闭按钮绑定的是touch事件,而按钮下面元素绑定的是click事件,touch事件触发后,蒙层消失,300ms后这个点的click事件触发。






2) 跨页面点击穿透问题


如果按钮下面恰好是一个href属性的a标签,那么页面就会发生跳转(a标签跳转默认是click事件触发的)






解决问题:


方法一:自己封装tap事件不会有穿透问题,因为阻止了默认行为  e.preventDefault();






方法二:吃掉touch之后的click, 使用计时器,让touch后延迟350ms再隐藏蒙层






方法三:使用fastclick.js;可以直接写click事件






还有,其它方法,就不阐述了
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号