简单粗暴方式解决H5移动端页面滚动的时候触发touchend事件

摘要:
Android和IOS微信内置浏览器中H5移动终端页面的形式不同,因此我统一使用触摸事件,而不是单击事件1。当触发触摸启动事件时,设置全局变量(名称可选)flag=1;2.触发touchmove事件时,设置flag=0;3.当触发touchend事件时,判断标志值。当标志=1时,触发touchend事件中的功能。触发后,在末尾设置标志=1;这是我的代码缩写

H5移动端的页面在安卓和IOS微信内置浏览器中呈现的形式不一样,所以我统一采用touch事件代替click事件

1,touchstart事件触发的时候设置全局变量(名字随便取)flag = 1;

2,touchmove事件触发的时候设置 flag = 0;

3,touchend事件触发的时候判断flag值 当flag = 1 的时候触发touchend事件里面的函数,触发完以后在末尾再设置flag = 1;

下面是我的代码简写:

直接上代码吧

<template>
    <div class="sitelist">
        <p>站点下拉列表</p>

        <div class="city">
          <div class="city-wrapper city-wrapper-hook">
            <div class="scroller-hook">
              <div class="cities cities-hook">
                <div v-for="(i,index) in value" :key="index">
                    <div class="title">{{i[label]}}</div>
                    <ul>
                        <li v-for="(item,is) in i[children]" :key="is"   :data-name="item[label]" :data-id="item[relkey]"><span   @touchend="touchUp(item)"  @touchstart="chooseCity()" @touchmove="demochind">{{item[label]}}</span>
                        </li>
                    </ul>
                </div>
              </div>
            </div>
            <div     @touchstart="touchIndex">
                <ul style=" 100px;text-align: left;padding: 20px 0">
                    <li v-for="(i,ino) in value" :key="ino" :data-anchor="i[label]" class="item">{{i[label].substr(0, 1)}}</li>
                </ul>
            </div>
          </div>
        </div>


    </div>
</template>
<script>
import BScroll from 'better-scroll'

export default {
    name:"sitelist",

    props: {
        value: {
            type: Array, // 数据源
            default: []
        },
        label: {
            type: String,
            default: 'name'
        },
        children: {
            type: String,
            default: 'children'
        },
        relkey: {
            type: String,
            default: 'id'
        }
    },
    data(){
        return{
            dd:1,
            cityWrapper: document.querySelector('.city-wrapper-hook'),
            cityScroller: document.querySelector('.scroller-hook'),
            cities: document.querySelector('.cities-hook'),
            shortcut: document.querySelector('.shortcut-hook'),
            shortcutList: [],
            scroll: null,
            anchorMap: {},
            touch: {},
            flag:10,//防止误点击
        }
    },
    mounted () {
        this.initCities()
    },
    methods: {
            demochind(){//++++
                this.flag = 0;
            },
            chooseCity (city) {
                this.flag = 1;//+++
                let v = this
                v.countTime = 0
                v.countTimer = setInterval(function(e){v.countTime ++},1)

            },
            touchUp (item) {
                
                //let v = this
                //clearInterval(v.countTimer);
                //console.log(v.countTimer);
                //this.$emit('click', item);
                
                if(this.flag==1){
                    this.flag = 1;//+++
                    this.$emit('click', item);
                }else{
                    this.flag = 1;//+++
                }


                
                // if (v.countTime < 30) {
                //     this.isShowCitys = false
                //     // this.location = item[v.label]
                //     // this.submit.area_code = item[v.relkey]
                // }
                

                /*
                let v = this
                clearInterval(v.countTimer)
                
                 if (v.countTime < 30) {
                    this.isShowCitys = false

                    this.$emit('click', item)

                     // this.location = item[v.label]
                     // this.submit.area_code = item[v.relkey]
                 }
                 */
                 
            },
            initCities: function () {
                let v = this
                let y = 0;
                  var titleHeight = 28
                  var itemHeight = 44
                  v.value.forEach(function(e){
                        let label = e[v.label].substr(0, 1)
                        let len = e[v.children].length
                        v.anchorMap[label] = y
                        y -= titleHeight + len * itemHeight
                  })
                  v.shortcut = document.querySelector('.shortcut-hook')
                  v.cityWrapper = document.querySelector('.city-wrapper-hook')
                  v.shortcut.style.top = (v.cityWrapper.clientHeight - v.shortcut.clientHeight) / 2 + 'px';
                  v.scroll = new BScroll(v.cityWrapper, {
                    probeType: 3
                  })
                  v.scroll.scrollTo(0, 0);
            },
            touchIndex: function (e) {
                console.log(e, 'e')
                let v = this
                let anchor = e.target.getAttribute('data-anchor')
                console.log(anchor ,'anchor')
                let firstTouch = e.touches[0]
                console.log(firstTouch, 'firstTouch')
                console.log(v.touch, 'v.touch')
                v.touch.y1 = firstTouch.pageY
                v.touch.anchor = anchor
                v.scrollTo(anchor.substr(0,1))
            },
            scrollTo: function (anchor) {
                let v = this
                v.cityScroller = document.querySelector('.scroller-hook')
                var maxScrollY = v.cityWrapper.clientHeight - v.cityScroller.clientHeight
                var y = Math.min(0, Math.max(maxScrollY, v.anchorMap[anchor]))
                if (typeof y !== 'undefined') {
                    v.scroll.scrollTo(0, y);
                }
            }
        }
}
</script>
<style scoped>
    .mycity {
        text-align: center;
        font-size: 12px;
        margin: 20px 0;
    }
    .list-box {
        padding: 0 43px;
    }
    .list-item {
        height: 43px;
        line-height: 42px;
        border-bottom: 1px solid #ECECEC;
        text-align: center;
    }
    .item {
        list-style: none !important;
    }
    .list-item input {
        border:none;
        text-align: center;
        outline: none;
    }
    .small-icon {
        display: inline-block;
         100%;
        height: 100%;
        vertical-align: top;
    }
    .city {
        display: block;
    }
    .city .city-wrapper {
        position: fixed;
        top: 0;
        bottom: 0;
         100%;
        z-index: 100;
        background-color: #FFF
    }
    .city .city-wrapper .cities .title {
        height: 28px;
        padding-left: 16px;
        line-height: 28px;
        background-color: #f5f5f5;
        font-family: Helvetica;
        font-size: 16px;
        color: #878787;
    }
    .city .city-wrapper .cities .item {
        height: 44px;
        padding: 0 16px;
        line-height: 44px;
        font-size: 14px;
        color: #333
    }
    .city .city-wrapper .cities .item .name {
        display: block;
        position: relative;
    }
    .city .city-wrapper .cities .item .name:before,
    .city .city-wrapper .cities .item .name:after {
        display: block;
        position: absolute;
        border-top: 1px solid #e5e5e5;
        left: 0;
         100%;
        content: ' ';
    }
    .city .city-wrapper .cities .item .name:before {
        display: none;
        top: 0;
    }
    .city .city-wrapper .cities .item .name:after {
        display: block;
        bottom: 0;
    }
    .city .city-wrapper .cities .item:active {
        background-color: #f0f0f0;
    }
    .city .city-wrapper .cities .item:last-child .name:after {
        display: none;
    }
    .city .city-wrapper .shortcut {
        position: absolute;
        z-index: 30;
         40px;
        right: 0;
        font-family: Helvetica;
    }
    .city .city-wrapper .shortcut .item {
        height: 12px;
        padding-top: 6px;
        padding-left: 24px;
        text-align: center;
        font-size: 14px;
        color: #fa8919;
    }
    @media only screen and (max-height: 600px) {
        .city .city-wrapper .shortcut .item {
            padding-top: 3px;
        }
    }
    .cities .cities-hook> div {
         70%;
    }
</style>

  

免责声明:文章转载自《简单粗暴方式解决H5移动端页面滚动的时候触发touchend事件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】分析SQL Server计划缓存Nuxt项目启动或打包时,显示内存不足溢出问题解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WebRTC学习(五)WebRTC信令服务器

一:使用socket.io发送消息 (一)socket.io服务端发送消息 broadcast会向站点中的所有房间发送消息 (二)socket.io客户端处理消息 二:WebRTC信令服务器 (一)信令服务器(TCP)作用 1.媒体相关信息交换:发送SDP描述信息(是否支持音频、视频,已经对应的编解码信息),通过信令服务器进行中转(因为两个客户端...

JavaScript中的鼠标事件

利用下面这个div标签来做鼠标事件的演示,当把鼠标在‘我是div’和’我是span‘两个位置及其之外的位置上操作时,不同事件操作结果不同 <div class="div1">我是div   <br>         <span>我是span</span>     </div> 1、左键单击事件...

JavaScript中DOM操作之设定标签属性

一、标签属性值的设定和获取 标签对象.steAttribute('属性名称',属性值);一次只能定义一个,如果要定义多个,需要多次执行获取标签属性值标签对象.getAttribute('属性名称');获取的结果都是字符串 //获取所有div的标签 var oDiv1 = document.querySelector('div'); //并且将属性设置为in...

H5基于iScroll实现下拉刷新,上拉加载更多

前言       前一段有个手机端的项目需要用到下拉刷新和上拉加载更多的效果,脑海里第一反映就是微博那种效果,刚开始的理解有些偏差,以为下拉也是追加数据,上拉也是追加数据,后请教同事后发现其实下拉只是刷新最新数据而已,上拉是追加数据。 使用技巧       1、引用iScroll.js, 在初始化时添加两个事件监听:touchMove、DOMContent...

基于vue的颜色选择器vue-color-picker

项目中有用到颜色选择器的童鞋们可以看过来了 关于color-picker的jquery的插件是有蛮多,不过vue组件没有吧,反正我没有找到, 虽然element-ui里面有这个,但是你愿意为了一个小功能去引入这么大的依赖库吗? 适用于:想写基于vue的单个color-picker功能的童鞋 甩github地址啦:https://github.com/ale...

IE6、IE7兼容querySelectorAll和querySelector方法-最终版本

 querySelector 和 querySelectorAll 方法是 W3C Selectors API 规范中定义的。他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素。目前几乎主流浏览器均支持了他们。包括 IE8(含) 以上版本、 Firefox、 Chrome、Safari、Opera。  querySelector 和 queryS...