js拖拽事件的处理

拖拽事件的处理

需求是这样的,需要实现拖入文件到聊天框后,显示遮罩层,松开后发送文件

遇到问题:拖入文件进入聊天框后,因为聊天框中已经加载的样式较多。就会出现enter leave enter leave不断重复触发的场景。遮罩层一直在闪烁。

先说下原因吧,父元素设置监听拖拽后,当拖拽元素进入该元素后,如果该元素内部仍有许多元素,那么这个拖拽元素每进入一个新的元素就会触发一次enter,离开就会触发leave。

所以我们就需要在enter的时候做一次标记,确保离开的是父元素而不是内部的某个子元素,

还是烦了一段时间了。

<template>
<div class="index_box">  
  <div class="bg" v-show="imgFlag">
    <span class="bg-tip" v-show="!isShowProgress">Drop here to send</span>
<el-progress v-show="isShowProgress" class="prgress" type="circle" :percentage="percent" style="margin-top: 20px"></el-progress>
	</div>  
</div>
</template>


mounted() {
  this.handleListenerDrag()
},
methos: {
  // 监听拖拽
  handleListenerDrag () {
    const dropEle = $('.index_box')// 监听的元素
    let lastenter = null
    dropEle.on('dragenter', function (ev) {
      lastenter = ev.target // 记录最后进入的元素
      if (this.imgFlag = true) {
        return
      }
      dropEle.addClass('dragging-over')
      this.imgFlag = true
    }.bind(this))
    dropEle.on('dragleave', function (ev) {
      if (lastenter === ev.target) {
        dropEle.removeClass('dragging-over')
        ev.stopPropagation()
        ev.preventDefault()
        this.imgFlag = false
        this.percent = 0
        this.isShowProgress = false
      }
    }.bind(this))
    dropEle.on('drop', function (ev) {
      this.handleDragOver(ev.originalEvent)
      dropEle.removeClass('dragging-over')
    }.bind(this))
  },
  // 发送
  handleDragOver() {
      
  }
}


<style>
.index_box {
  position: relative;
  width: 100%;
  height: 100%;
}
/deep/.el-progress__text {
  text-align: center;
}
.bg {
  background-color: rgba(255,255,255,.6);
  width: 100%;
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
  z-index: 998;
  display: flex;
  align-items: center;
  justify-content: center;
  .bg-tip {
    font-size: 16px;
    font-weight: bold;
  }
}
.dragging-over {
  pointer-events: none;
}  
</style>

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!