引言
在开发小程序时,我们常常会遇到需要弹出浮层的场景,比如点击某个按钮弹出一个弹窗。而弹出的浮层上再有一个弹框,这时候我们会给遮罩层绑定一个点击事件,当点击时就关闭完全弹框,即点击遮罩层关闭浮层。但是我们可能会遇到这样一个尴尬的问题,就是点击浮层上的某个交互组件(比如按钮)时,也会触发遮罩层下面的按钮点击事件,显然不是我们想要的。本文将介绍如何解决这个问题。
解决方法
为了防止出现遮罩层下面的按钮点击事件,在浮层上我们需要阻止事件冒泡。事件冒泡是指事件从最具体的元素开始触发,然后逐级向上传播,直到触发文档上的DOM元素。
什么是事件冒泡?
事件冒泡的触发可以用下面的代码演示:
document.querySelector('.box').addEventListener('click', function () {
console.log('box click');
});
document.querySelector('.inner').addEventListener('click', function () {
console.log('inner click');
});
document.querySelector('.btn').addEventListener('click', function (e) {
console.log('btn click');
e.stopPropagation();
});
当点击按钮时,事件将从按钮元素开始触发,然后逐级向上冒泡至inner元素和box元素。因为我们在按钮点击事件处理函数中调用了e.stopPropagation(),所以只有按钮事件被触发,inner和box都没有被触发。
在小程序中阻止事件冒泡
现在我们知道了如何阻止事件冒泡,那么在小程序中我们怎样可以阻止事件冒泡呢?下面是在小程序中阻止事件冒泡的代码示例:
// 获取浮层组件
var maskComponent = this.selectComponent('#maskComponent');
// 在浮层上绑定点击事件,阻止事件冒泡
maskComponent.myMaskClick = function () {
console.log('浮层点击事件!');
};
// 在内容区域上绑定点击事件,也阻止事件冒泡
maskComponent.myContentClick = function (e) {
console.log('内容区域点击事件!');
e.stopPropagation();
};
在这里,我们获取了浮层组件,并向代表浮层的组件中添加了myMaskClick事件和myContentClick事件。我们将myMaskClick事件绑定到了浮层上,当浮层被点击时会触发这个事件。我们也将myContentClick事件绑定到了内容区域上,这样当内容区域被点击时,事件就会停在这里而不会传递到浮层上了。
总结
在开发小程序时,防止点击遮罩层后遮罩层下面也反应是一个很常见的需求。为了解决这个问题,我们需要了解事件冒泡的作用和阻止事件冒泡的方法。通过向代表浮层的组件中添加浮层事件和内容区域事件,我们就可以有效地防止点击遮罩层后遮罩层下面也反应了。