vue中防止子元素点击事件干扰父元素双击事件
在Vue应用中,子元素的click事件可能会干扰父元素的dblclick事件,尤其是在快速双击子元素时。本文提供两种解决方案。
问题示例:
假设有以下Vue组件:
<template> <div @dblclick="changeFullScreen"> <div @click="showPreset"></div> </div> </template> <script> export default { methods: { showPreset(Event) { console.log('aaaaa'); }, changeFullScreen(event) { console.log('bbbb'); } } }; </script>
简单使用@click.stop并不能解决问题,因为click和dblclick是不同的事件。
立即学习“前端免费学习笔记(深入)”;
解决方案一:在子元素上添加空双击事件
在子元素上添加一个@dblclick事件,并绑定一个空函数,阻止双击事件冒泡:
<template> <div @dblclick="changeFullScreen"> <div @click="showPreset" @dblclick="noop"></div> </div> </template> <script> export default { methods: { noop() {}, showPreset(event) { console.log('aaaaa'); }, changeFullScreen(event) { console.log('bbbb'); } } }; </script>
noop函数什么也不做,但阻止了dblclick事件向上冒泡。
解决方案二:在父元素事件处理函数中判断事件目标
在父元素的dblclick事件处理函数中,检查event.target是否为父元素本身。只有当双击事件直接作用于父元素时,才执行相应操作:
<template> <div @dblclick="changeFullScreen"> <div @click="showPreset"></div> </div> </template> <script> export default { methods: { showPreset(event) { console.log('aaaaa'); }, changeFullScreen(event) { if (event.target === this.$el) { console.log('bbbb'); } } } }; </script>
this.$el指向父元素的dom节点。只有当event.target与this.$el相等时,才执行console.log(‘bbbb’)。
两种方法都能有效防止子元素点击事件干扰父元素双击事件,选择哪种方法取决于具体情况和个人偏好。 第一种方法更简洁直接,第二种方法更灵活,可以根据需要在父元素双击事件中添加更多逻辑判断。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
喜欢就支持一下吧
相关推荐