移动web点击事件--tap的封装

ゝ一世哀愁。 2022-03-30 02:18 315阅读 0赞

基础知识点的了解

https://blog.csdn.net/weixin_41105030/article/details/85763149

先来看一个例子,和我封装的tap代码

HTML

  1. <ul>
  2. <li class="">热门推荐</li>
  3. <li class="active">潮流女装</li>
  4. <li class="">品牌男装</li>
  5. <li class="">内衣配饰</li>
  6. <li class="">家用电器</li>
  7. <li class="">电脑办公</li>
  8. <li class="">手机数码</li>
  9. <li class="">母婴频道</li>
  10. </ul>

CSS

  1. *{
  2. margin: 0;
  3. padding: 0;
  4. font-size: 13px;
  5. list-style: none;
  6. }
  7. ul{
  8. margin: 50px auto;
  9. width: 100px;
  10. }
  11. li{
  12. width: 100px;
  13. height: 50px;
  14. background: #ccc;
  15. text-align: center;
  16. line-height: 50px;
  17. cursor: pointer;
  18. }
  19. li.active{
  20. background: hotpink;
  21. color: red;
  22. }

m端呈现的效果图
在这里插入图片描述

需求:当点击li时,给当前点击的li添加active类,并把li的兄弟元素有active的去掉

  1. click在移动端有延迟,所以要重新封装一个点击事件

    Object.prototype.tap = function(callback){

    1. var startTime,startX,startY
    2. this.addEventListener('touchstart',function(e){
    3. if(e.touches.length>1){
    4. return;
    5. }
    6. startTime = Date.now()
    7. startX = e.touches[0].clientX
    8. startY = e.touches[0].clientY
    9. })
    10. this.addEventListener('touchend',function(e){
    11. if(e.changedTouches.length>1){
    12. return;
    13. }
    14. if(Date.now()-startTime > 150){ //长按操作
    15. return;
    16. }
    17. var endX=e.changedTouches[0].clientX;
    18. var endY=e.changedTouches[0].clientY;
    19. if(Math.abs(endX-startX) < 6 && Math.abs(endY-startY) <6){
    20. callback && callback(e);
    21. }
    22. })

    }

  2. 调用tap方法实现需求

    var ul = document.querySelector(‘ul’)
    var li = ul.querySelectorAll(‘li’)
    li.forEach(function(item){
    item.tap(function(){

    1. document.querySelector('.active').classList.remove('active')
    2. this.classList.add('active')

    }.bind(item))
    })

tap事件封装

  1. dom是一个对象,所以我们的dom可以访问到Object的原型上的成员
  2. 可以使用普通函数来封装,tap点击会多次调用,重复创建属性和方法消耗内存
  3. 封装注意:从touchstart到touchend过程–点击的时间不能过长;点击过程移动范围最好要无限0;点击目标元素只能一个触碰点

tap封装语言解析

  1. Object.prototype.tap = function(callback){
  2. var startTime,startX,startY
  3. this.addEventListener('touchstart',function(e){
  4. if(e.touches.length>1){
  5. // 判断是否只有一根手指点击,没有点击事件tap不生效
  6. return;
  7. }
  8. startTime = Date.now()
  9. // 刚触碰目标元素的时间
  10. startX = e.touches[0].clientX
  11. // 刚触碰界面时手指距离界面左端(视口)的距离
  12. startY = e.touches[0].clientY
  13. // 刚触碰界面时手指距离界面上端(视口)的距离
  14. })
  15. this.addEventListener('touchend',function(e){
  16. if(e.changedTouches.length>1){
  17. // 判断过程到结束是否只有一根手指点击
  18. return;
  19. }
  20. if(Date.now()-startTime > 150){
  21. //长按操作,如果触碰目标元素的事件太长,则不执行点击事件tap
  22. return;
  23. }
  24. var endX=e.changedTouches[0].clientX;
  25. var endY=e.changedTouches[0].clientY;
  26. if(Math.abs(endX-startX) < 6 && Math.abs(endY-startY) <6){
  27. // 我们限制触碰过程中手指不能移动范围过大,我们限制在一个半径为6px的移动范围内
  28. callback && callback(e)
  29. // 回调函数--判断是否有传入处理函数,有则调用
  30. }
  31. })
  32. }

发表评论

表情:
评论列表 (有 0 条评论,315人围观)

还没有评论,来说两句吧...

相关阅读