12_微信小程序-BLE低功耗蓝牙开发-自定义弹窗界面

本文详细介绍了在微信小程序中如何通过自定义组件实现弹窗功能,包括解决页面可滑动问题、单击事件穿透以及输入框事件穿透等常见问题。通过设置特定的WXML和WXSS样式,以及在JS文件中处理点击事件,成功创建了一个具备遮罩层和内容层的弹出框,并在点击遮罩层时自动关闭弹出窗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在获取服务列表和特征值列表完成后,需要把相关的信息呈现出来,这里采用一个弹窗界面,把服务ID和特征值ID显示出来。微信小程序的原生弹窗不能满足需求,这里只有自定义弹窗窗界面了。

wxml代码:

<!--弹出框-->
<!--要加上catchtouchmove="dialogViewTouchMove",否则页面可滑动-->
<view class="dialogView" catchtouchmove="dialogViewTouchMove" wx:if="{{dialogViewShowFlag}}">
    <!--遮罩,用来处理弹出框之外区域的点击事件,并且防止点击事件穿透-->
    <view class="dialogMaskView" catchtap="dialogMashViewClick">
        <!--文本输入框遮罩,防止弹出框底层有文本框,输入事件就直接穿透过去了-->
        <textarea class="dialogMaskTextarea" disabled="{{true}}"></textarea>
    </view>
    <!--弹出内容-->
    <view class="dialogContentView">
        <text>弹出内容、弹出内容</text>
        <button bindtap="dialogContentButtonClick">按钮</button>
    </view>
</view>

wxss代码:

/*弹出框样式*/
.dialogView {
    width: 100%;
    height: 100%;
    /*设置弹出框在那一层,数值约大,越前面*/
    z-index: 9998;
}
/* 遮罩层 */
.dialogMaskView{
    width: 100%;
    height: 100%;
    position: fixed;
    top: 0;
    left: 0;
    background: #000;
    opacity: 0.5;
}
/*遮罩层里面的文本输入框*/
.dialogMaskTextarea {
    width: 100%;
    height: 100%;
}


/* 内容层 */
.dialogContentView{
    height: 80%;
    width: 80%;
    /*设置弹出框在那一层,数值约大,越前面,设置内容层在弹出层的前面*/
    /* z-index: 9999; */
    position: fixed;
    top: 50px;
    left: 0;
    right: 0;
    margin: 0 auto;
    background-color: #fff;
    border-radius:5px;
    display: flex;
    flex-direction: column;
    align-items: center;
}

在js文件中增加了一个点击内容层之外区域自动隐藏弹出窗的功能

dialogMashViewClick: function(e) {
        debug.Debug(BLECTR_MODUAL_NAME, debug.DEBUG_DEBUG, "dialogMashViewClick");
        // 点击内容层之外区域(遮罩层),隐藏弹出窗口
        this.data.dialogViewShowFlag = false;
        this.setData({['dialogViewShowFlag']: this.data.dialogViewShowFlag});
    },

最终的效果:

弹出界面有三个需要注意的地方

1. 弹出层导致页面可滑动问题

        在弹出窗口的view里面加上 catchtouchmove="dialogViewTouchMove" ,dialogViewTouchMove函数实现为空,用以拦截触摸滑动事件

2. 单击事件穿透(单击事件冒泡)

        当点击弹出层的时候,如果主页面对应的位置有按键,那个按键会响应,这个就是事件穿透了,需要阻止

        在遮罩层里面加入 catchtap="dialogMashViewClick" ,用以拦截点击事件。不要用bindtap,bindtap没有办法阻止事件冒泡问题。用户点击界面后,单击事件会一层一层的向父元素传递,直到遇到catchtap。

3. 输入框(input,texterea)输入穿透事件

        这个问题和单击事件类似,就是点击弹出窗的时候,如果主页面对应的位置有输入框,就会弹出键盘,并响应输入事件,这个是不愿意看到的。我尝试过用view去阻止,发现不行,所以在遮罩层里面又包裹了一个texteara控件,该控件和屏幕一样大,并且设置该控件不可用,用以屏蔽输入事件。

        

 

### 微信小程序BLE低功耗蓝牙调试方法 #### 准备工作 为了顺利进行微信小程序BLE低功耗蓝牙功能的开发与测试,需确认设备支持BLE特性并开启相应权限。具体来说,在手机设置中的应用程序选项里找到微信应用,进入其详情页面后切换至权限管理部分,确保已授予位置访问许可[^4]。 #### 连接流程验证 当尝试建立连接时,应仔细核对每一环节的状态反馈。通常情况下,会经历扫描可用外设、获取服务列表以及特征值读取这几个主要阶段。如果任一步骤失败,则需要依据错误提示排查原因所在。例如,若无法发现目标设备可能是由于广播间隔过长或是信号强度不足引起;而未能成功配对则可能涉及到PIN码输入不匹配等问题[^2]。 #### 数据交互检测 对于数据收发过程而言,可以借助日志记录工具来跟踪消息流向。一方面要关注发送端是否正确编码待传送的信息包;另一方面也要留意接收方能否准确解析收到的数据帧结构。此外还需注意某些特殊场景下的异常情况处理机制设计得当与否,比如超时重传策略的有效性评估等[^1]。 ```javascript // 日志打印示例代码 console.log('正在扫描...'); wx.startBluetoothDevicesDiscovery({ success(res) { console.log(`开始扫描:${JSON.stringify(res)}`); }, fail(err){ console.error(`启动扫描失败:${err.errMsg}`); } }); ``` #### 版本兼容性考量 不同版本的小程序框架可能存在API差异,因此建议始终保持最新稳定版更新频率的同时参照官方文档说明调整调用方式。特别是针对一些新增加的功能模块更要提前做好适配准备,以免造成不必要的麻烦[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值