公司APP项目基于Angular2+Ionic 最近需要实现一个支持向上\向下滑动显示不同内容的页面,实际实现时发现有如下的坑:
1.移动端有自己的默认上滑\下滑事件,并不识别Ionic自带的识别指令,只能识别on-swipe指令且只支持左右滑动
on-swipe-up 和 on-swipe-down 指令完全无法使用
2.如果自己实现必须要捕获触摸事件,TypeScript中事件捕获要么使用传统的addEventListener
//事件监听 public eventListener(){ document.addEventListener('click', function(e: MouseEvent) { alert(213) }); }
要么使用Angular2核心模块的@HostListener机制捕获事件
@HostListener('touchstart') dealwith1(){ this.OrClientY = event['targetTouches'][0].clientY } @HostListener('touchend') dealwith2(){ if(event['changedTouches'][0].clientY>this.OrClientY){ this.allcon = false }else if(event['changedTouches'][0].clientY<this.OrClientY){ this.allcon = true } }
第一种方式并不适合TypeScript的表达方式,必须把document.addEventListener封装在另一个函数中,并且在构造函数中调用,十分不方便,所以我选择了第二种方式
解决以上问题后,来看看我的实现原理吧:
上下滑动实现原理如下:
1.监听touchstart事件,当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发
使用变量this.OrClientY将本次event所触碰的clientY属性记录下来
换句话说把每次用户刚开始滑动屏幕时的Y坐标记录下来
2.监听touchend事件,当手指从屏幕上离开的时候触发
每次比对捕获到的touchend事件当前Y坐标,如果这个Y大于this.OrClientY那么就表示'上滑'
如果Y小于this.OrClientY则表示'下滑'.代码中this.allcon是控制angular2页面ngIf指令的一个标记.
同理可以实现左右滑动的判定,甚至也可以实现任意方向,甚至可以控制滑动距离,这种解决方案相对不依赖框架和平台,可以作为当前框架没有支持时的一种备选.
缺点也很明显,如果要实现较为复杂的手势判定则需要编制较为复杂的代码,需要对平面几何有一定的了解.
以前看书时会看到说JS基础很重要,现在看来,任何一个框架都不可能面面俱到,总会面临各种不符合需求的情况,此时就需要使用JS支持写出弥合缝隙的代码,而不是说你只需要会框架就可以的.