Taro小程序 点击某元素以外的地方触发事件 - Kaiqisan

大家好,都吃晚饭了吗?我是Kaiqisan,是一个已经走出社恐的一般生徒,这个话题之前也讲过了,不过这次是要在小程序里面实现,这个模块的功能在小程序中出现得比较多,所以就在之前也用过一次,
它终归还是和web端有点不同,不过还好它并不太复杂。

(web端实现方法详见我的这篇博客-----------> 给个链接)

现在我们写好了这个页面

在这里插入图片描述
我们需要点击灰色的页面触发某事件,而点击白色区域不会(很多小程序内部的通知弹窗啥的都是这样的,点击弹窗以外的地方就可以实现弹窗的关闭)

html代码部分

<View className='main'>
    <View className='inner' id='app'>
    	<View className='inner2'>add</View>
        <Text>ddd</Text>
    </View>
</View>
  • 下一步,我们开始绑定点击事件
{/* main是主节点,长宽都是屏幕尺寸 */}
<View className='main' onClick={this.cancel.bind(this)}>
    <View className='inner'>
    	<View className='inner2'>add</View>
        <Text>ddd</Text>
    </View>
</View>

切记绑定事件一定要绑定到外部的元素上(因为这个事件监测是全屏监测)

  • 在书写事件之前要说明一件事情,在小程序的获取事件中,并不会获取当前事件所指向的DOM元素(target)以及其事件的冒泡顺序(path),而是只会获取当前触发事件的元素的id,所以在监听之前,我们需要获取外层元素内部的所有的节点id(内部很多子节点,它们各有自己的id,如果只是获取一个外层的id,整个监测的设计是不彻底的,容易导致不好的用户体验)
    在这里插入图片描述
    所以我们需要遍历这颗节点子树(我们这里使用了递归)
// ts版
	searchId(currentNode): void {
        let nowList: string[] = this.state.idList;
        nowList.push(currentNode.uid);
        this.setState({ // 修改idList ,如果您使用vue的话就直接修改this.idList即可
            idList: nowList
        });
        if (currentNode.childNodes.length) {
            for (let i = 0; i < currentNode.childNodes.length; i++) {
                this.searchId(currentNode.childNodes[i])
            }
        }
    }
// js版
	searchId(currentNode) {
        let nowList = this.state.idList;
        nowList.push(currentNode.uid);
        this.setState({ // 修改idList ,如果您使用vue的话就直接修改this.idList即可
            idList: nowList
        });
        if (currentNode.childNodes.length) {
            for (let i = 0; i < currentNode.childNodes.length; i++) {
                this.searchId(currentNode.childNodes[i])
            }
        }
    }

现在,我们所有的id信息都储存在 idList当中去了

在这里插入图片描述
图中为小程序默认给的id,如果您自己命名了某节点id,就不会再采用默认id

然后剩下的判断步骤就和web端的一模一样了

// ts版
	cancel(e: TaroEvent<any>) {
		// vue直接书写this.idList
        if (!this.state.idList.includes(e.target.id)) {
            console.log('ok'); // 里面执行符合条件的方法,最常见的就是关闭小窗口
        }
    }
// js版
	cancel(e) {
		// vue直接书写this.idList
        if (!this.state.idList.includes(e.target.id)) {
            console.log('ok'); // 里面执行符合条件的方法,最常见的就是关闭小窗口
        }
    }

最终实现效果

在这里插入图片描述

总结

本篇文章基于taro+react+ts,如果您不是使用上面的框架(或语言或打包工具)请麻烦您稍微切换一下!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Taro小程序点击复制功能是指用户在小程序点击某个元素后,可以将该元素的内容复制到剪贴板上,以供用户粘贴到其他地方使用。 为了实现点击复制功能,我们可以在Taro小程序中使用Clipboard API。首先,需要在小程序json配置文件中开启该功能,即在"permission"字段中添加"writeClipboard"权限。 然后,在相应的页面中,在需要复制的元素上添加点击事件的监听函数。监听函数中,我们可以使用Taro的`Taro.setClipboardData`方法,将需要复制的内容传入该方法,从而实现内容的复制。 下面是一个示例代码片段: ```javascript // 在需要复制的元素上添加点击事件 <TouchView onClick={handleCopy}>点击复制</TouchView> // 监听函数 handleCopy = () => { const content = '需要复制的内容'; Taro.setClipboardData({ data: content, success: function () { Taro.showToast({ title: '复制成功', icon: 'success', duration: 1000 }) } }) } ``` 以上代码中,我们在需要复制的元素上添加了一个点击事件监听函数`handleCopy`。在函数内部,我们定义了需要复制的内容`content`,然后使用`Taro.setClipboardData`方法将内容复制到剪贴板上。如果复制成功,我们还可以通过`Taro.showToast`方法显示一个提示信息。 通过以上代码的实现,我们就可以在Taro小程序中实现点击复制的功能了。当用户点击需要复制的元素后,目标内容会被复制到剪贴板上,用户可以随时粘贴到其他地方使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaiqisan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值