微信小程序解决view点击事件穿透地图map触发markertap

Posted Joke#

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微信小程序解决view点击事件穿透地图map触发markertap相关的知识,希望对你有一定的参考价值。

微信小程序中使用map组件,ios手机中点击地图上的view,会触发底下的markertap,只要底下如果有marker点的话。

这就造成了用户体验不是很好。

然后无意间我发现点击能滑动的scroll-view反而不会触发底下的markertap,就等于是一个不穿透的容器。我就在想是不是view也可以换成scroll-view,然后防止穿透点击,答案是:可以。

但是体验还是不太好,因为scroll-view会滑动,所以按钮里面的内容也会滑动,不是最佳的解决方法。于是,我就想到可以用透明的可滑动的scroll-view放在上层作为隐形按钮,下层放普通的按钮样式,这回真正的解决了ios的bug。

一、地图上覆盖的子组件代码

wxml代码

<view class="box">
    <swiper circular>
        <swiper-item wx:for="switchArr">
            <view class="container" catchtap="switchItem" data-index="index" data-name="item.name">
                <view class="card">
                    <view class="content">
                        <view class="icon">
                            <image src="item.imageUrl" mode="aspectFill"></image>
                        </view>
                        <view class="bt">
                            <view class="title">item.name</view>
                        </view>
                    </view>
                </view>
            </view>
            <scroll-view class="scroll-view" scroll-y="true" catchtap="switchItem" data-index="index" data-name="item.name">
                <view style="height:100vh;"></view>
            </scroll-view>

        </swiper-item>
    </swiper>
    <view class="cancelSwitch" style="top:statusHeight+3px" catchtap="cancelSwitch">
        <text>退出页面</text>
    </view>

</view>

less代码

/* pages/subPack/otherAnimation/index.wxss */

page 
    box-sizing: border-box;
    font-family: sans-serif;


.cancelSwitch
    position: absolute;
    left: 40rpx;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 210rpx;
    height: 60rpx;
    line-height: 60rpx;
    border-radius: 30rpx;
    color:#fff;
    background-color: #d94251;
    image
        width: 35rpx;
        height: 30rpx;
        margin-left: 3rpx;
    

.box
    position: fixed;
    z-index: 10000;
    min-height: 100vh;
    background-color: #1a1c22;
    width: 100%;

    swiper 
        width: 100%;
        height: 100vh;

        swiper-item 
            width: 100%;
            height: 100vh;
            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;

            .container 
                position: relative;
                display: flex;
                justify-content: space-around;
                align-items: center;
                width: 710rpx;

                .card 
                    width: 100%;
                    margin: 20px;
                    padding: 40px 30px;
                    border-radius: 40px;
                    background-color: #20252a;
                    border: 4rpx solid #ffefa1;
                    box-shadow: -0px -0px 10px #ffefa1;

                    .imgBx 
                        position: relative;
                        text-align: center;
                    
                    .content 
                        text-align: center;
                        display: flex;
                        flex-wrap: wrap;
                        justify-content: center;
                        align-items: center;

                        .icon 
                            padding: 20px;
                            margin-top: 15px;
                            height: 100%;
                            width: 120%;
                            border-radius: 40px;
                            color: #32a3b1;
                            font-size: 16px;
                            overflow: hidden;
                            text-decoration: none;
                            background: #20252a;
                            box-shadow: 13px 13px 26px #181c20, -13px -13px 26px #282e35;

                            image 
                                width: 100%;
                                border-radius: 10px;
                            
                        

                        .bt 
                            display: inline-block;
                            padding: 10px 20px;
                            margin-top: 45px;
                            border-radius: 40px;
                            color: #ffefa1;
                            font-size: 16px;
                            text-decoration: none;
                            background: #20252a;
                            box-shadow: 20px 20px 41px #161a1d,
                                -20px -20px 41px #2a3037;

                            &:hover 
                                background: #20252a;
                                box-shadow: inset 20px 20px 41px #161a1d,
                                    inset -20px -20px 41px #2a3037;
                            
                        
                    
                    &:hover 
                        background: #20252a;
                        box-shadow: inset 20px 20px 41px #161a1d,
                            inset -20px -20px 41px #2a3037;
                    

                
            
            .scroll-view
                width: 750rpx;
                background-color: #fff;
                position:absolute;
                height: 1000rpx;
                opacity: 0;
            
        
    

js代码

const app = getApp();
Component(
  data: 
    statusHeight: app.globalData.statusHeight,
    buttonCanUse:true
  ,
  properties: 
      switchArr:
          type:Array,
          value:[]
      
  ,
  methods: 
    switchItem(e) 
        if(!this.data.buttonCanUse)
            return
        
        this.setData(
            buttonCanUse:false
        )
        this.triggerEvent('switchItem', 
            index:e.currentTarget.dataset.index,
            name:e.currentTarget.dataset.name
        )
        this.setData(
            buttonCanUse:true
        )
    ,
    cancelSwitch() 
        this.triggerEvent('cancelSwitch')
    ,
  
)

二、小程序效果

map效果:map上面有很多点位 这些点位都是可以点击进去其他页面的点

 切换旅游路线的子组件:是覆盖在map之上的一个容器 z-index:10000

点击就可以切换到路线

三、问题所在

点击这个全景路线的时候 如果点击的位置下方有一个marker点,则他触发两个点击事件,即同时切换路线 同时进入marker点链接的路径

四、解决思路

利用可滑动的scroll-view不会穿透的特性,在子组件上面插入隐形scroll-view,设置点击事件,(用户以为点击的是子组件,实际上点击的是scroll-view,这是一个通用的思路),然后将scroll-view大小覆盖子组件

五、代码分析

核心代码:

<view class="container" catchtap="switchItem" data-index="index" data-name="item.name">
  <view class="card">
    <view class="content">
       <view class="icon">
         <image src="item.imageUrl" mode="aspectFill"></image>
       </view>
       view class="bt">
         <view class="title">item.name</view>
       </view>
    </view>
   </view>
</view> 
<scroll-view class="scroll-view" scroll-y="true" catchtap="switchItem" data-index="index" data-name="item.name">
       <view style="height:100vh;"></view>
</scroll-view>
.scroll-view
   width: 750rpx;
   background-color: #fff;
   position:absolute;
   height: 1000rpx;
   opacity: 0;

 <view class="container" catchtap="switchItem" data-index="index" data-name="item.name">是子组件里面每个路线的容器,点击可以切换路线

我在同级写了一个scroll-view 设置宽度750rpx撑满屏幕 然后高度1000rpx盖住整个路线容器 并且将透明度改为零(即opacity:0)

然后在wxml中 设置scroll-y=“true” 在scroll-view里面放一个高度100vh的盒子,让整个scroll-view可滑动,因为scroll-y,所以是上下滑动。

这里为什么不设置scroll-x=“true” 然后在横向上滑动 是因为 我本身用了swiper组件 左右滑动切换,用scroll-x的话,两个滑动事件会冲突,会影响原有的滑动感受。然后在scroll-view上

然后在scroll-view上添加原本写在container上面的点击的点击事件,让用户点的实际上是scroll-view

这样就可以保证ios系统手机点击不会穿透了。

微信小程序地图控件怎么绑定事件

参考技术A view标签 加 bindtap事件,用data-name传值,如果view中只有文字,点击整个view区域都可以接收到data-name的值,如果view里面加一个lable标签,那么点击lable包裹的区域,data-name取不到值。
解决方法:把取值方式 由e.target.dataset.carrierName 修改为e.currentTarget.dataset.carrierName即可!

以上是关于微信小程序解决view点击事件穿透地图map触发markertap的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序事件

微信小程序 iPhone6 ,iso10版本 scroll-view浮层 滑动穿透 滑动无效

微信小程序map地图的一些使用注意事项

微信小程序<map>地图组件闪退问题解决

微信小程序怎么设置view的回车

微信小程序实现地图定位