元素拖拽异常以及与点击事件冲突解决方法

一般的拖拽处理方法

<template>
  <div id="app">
    <div class="box" v-drag @click="clickEvent">123</div>
  </div>
</template>

<script>
export default {
  name: 'app',
  directives: {
	  drag: function(el) {
		  let dragBox = el; //获取当前元素
		  dragBox.onmousedown = e => {
			  //算出鼠标相对元素的位置
			  let disX = e.clientX - dragBox.offsetLeft;
			  let disY = e.clientY - dragBox.offsetTop;
			  document.onmousemove = e => {
				  let left = e.clientX - disX;
				  let top = e.clientY - disY;
				  dragBox.style.left = left + "px";
				  dragBox.style.top = top + "px";
			  };
			  document.onmouseup = e => {
					document.onmousemove = null; 
				  document.onmouseup = null;
			  };
		  };
	  }
	},
  data() {
	  return {
		  
	  }
  },
  created() {
  	
  },
  mounted() {
  	
  },
  methods:{
	  clickEvent() {
		  console.log('点击事件')
	  }
  }
  
}
</script>

遇到的问题

  1. click事件和onmousedown事件有时候会互相影响,拖拽的时候会触发点击事件
  2. 经过拖拽后onmouseup事件有时候会不触发

解决后的代码

<template>
  <div id="app">
    <div class="box" v-drag>123</div>
  </div>
</template>

<script>
export default {
  name: "app",
  directives: {
    drag: function (el,data,vnode) {
      let dragBox = el; //获取当前元素
      dragBox.onmousedown = (e) => {
        let disX = e.clientX - dragBox.offsetLeft;
        let disY = e.clientY - dragBox.offsetTop;
        document.onmousemove = (e1) => {
			//解决onmouseup事件有时候不触发
			if ( e1.stopPropagation ) {
				e1.stopPropagation()
			}
			if ( e1.preventDefault ) {
				e1.preventDefault()
			}
			let left = e1.clientX - disX;
			let top = e1.clientY - disY;
			dragBox.style.left = left + "px";
			dragBox.style.top = top + "px";
        };
        document.onmouseup = (e2) => {
          document.onmousemove = null;
          document.onmouseup = null;
		  if ( e.clientX == e2.clientX && e.clientY == e2.clientY ) {
			  vnode.context.clickEvent()//想要添加的元素的点击事件
		  }
        };
      };
    },
  },
  data() {
    return {};
  },
  created() {},
  mounted() {},
  methods: {
	  clickEvent() {
		  console.log('点击事件')
	  }
  },
};
</script>

最后祝大家在程序猿的路上远走远远,哈哈。。。

通常情况下,解决这种冲突方法是使用事件委托。你可以将事件绑定到一个共同的祖先元素上,然后根据事件触发的元素来判断执行哪种操作。具体步骤如下: 1.给祖先元素绑定一个 `touchstart` 事件。在事件处理函数中,判断事件触发的元素是否为 swiper 的元素,如果是,则执行 swiper 的拖动操作;如果不是,则执行另一个拖动操作。 2.给祖先元素绑定一个 `touchmove` 事件。在事件处理函数中,判断事件触发的元素是否为 swiper 的元素,如果是,则执行 swiper 的拖动操作;如果不是,则执行另一个拖动操作。 3.给祖先元素绑定一个 `touchend` 事件。在事件处理函数中,判断事件触发的元素是否为 swiper 的元素,如果是,则执行 swiper 的拖动操作;如果不是,则执行另一个拖动操作。 注意:在判断事件触发的元素时,可以通过 `event.target` 属性获取到当前触发事件的元素。 示例代码如下: ``` // 获取祖先元素 var ancestor = document.getElementById('ancestor'); // 给祖先元素绑定 touchstart 事件 ancestor.addEventListener('touchstart', function(event) { // 判断事件触发的元素是否为 swiper 的元素 if (event.target.classList.contains('swiper-element')) { // 执行 swiper 的拖动操作 swiperDrag(); } else { // 执行另一个拖动操作 otherDrag(); } }); // 给祖先元素绑定 touchmove 事件 ancestor.addEventListener('touchmove', function(event) { // 判断事件触发的元素是否为 swiper 的元素 if (event.target.classList.contains('swiper-element')) { // 执行 swiper 的拖动操作 swiperDrag(); } else { // 执行另一个拖动操作 otherDrag(); } }); // 给祖先元素绑定 touchend 事件 ancestor.addEventListener('touchend', function(event) { // 判断事件触发的元素是否为 swiper 的元素 if (event.target.classList.contains('swiper-element')) { // 执行 swiper 的拖动操作 swiperDrag(); } else { // 执行另一个拖动操作 otherDrag(); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值