drag拖拽事件

本文介绍了如何利用HTML的draggable属性开启拖拽功能,并结合JavaScript和Vue.js处理拖拽事件,实现列表形式的树数据的拖拽后重新排序功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标签属性

draggable 打开拖拽功能

拖拽事件
	// 用户开始拖拉时,在被拖拉的节点上触发,该事件的target属性是被拖拉的节点
    dragHandler(event) {
      event = event || window.event || arguments.callee.caller.arguments[0];
      event.stopPropagation();
      //拖动起手
      this.grid.removeNodeData = this.rowData;
    },
    // 拖拉到当前节点上方时,在当前节点上持续触发(相隔几百毫秒)
    dragOverHandler(event) {
      event = event || window.event || arguments.callee.caller.arguments[0];
      event.preventDefault();
    },
    // 拖拉进入当前节点时,在当前节点上触发一次
    dragEnterHandler(event) {
      this.preventHandler(event);
    },
    // 拖拉操作离开当前节点范围时,在当前节点上触发
    dragLeaveHandler(event) {
      this.preventHandler(event);
    },
    // 被拖拉的节点或选中的文本,释放到目标节点时,在目标节点上触发
    dragDropHandler(event) {
      this.preventHandler(event);
      if(this.rowData.id==this.grid.removeNodeData.id) return
      if(this.rowData.parentid!==this.grid.removeNodeData.parentid) return
      // 排序操作
      this.grid.orderTreeRow(this.rowData)
    },
    // 阻止冒泡和默认事件
    preventHandler(event) {
      event = event || window.event || arguments.callee.caller.arguments[0];
      event.returnValue = false;
      event.preventDefault();
      event.stopPropagation();
    }
列表形式的树数据

拖拽后重新排序

orderTreeRow(rowData) {
      let removeCount = { num: 0 };
      let currentCount = { num: 0 };
      // 寻找子节点
      let findChildren = function(list, rootId, count) {
        const arr = [];
        list.forEach(item => {
          if (item.parentid === rootId) {
            count.num += 1;
            const children = findChildren(list, item.id, count);
            if (children.length) {
              item.children = children;
            }
            arr.push(item);
          }
        });
        return arr;
      };
      findChildren(this.renderData, this.removeNodeData.id, removeCount);
      findChildren(this.renderData, rowData.id, currentCount);
      let idx1 = this.renderData.findIndex(
        item => item.id === this.removeNodeData.id
      );
      const arr = this.renderData.splice(idx1, 1 + removeCount.num);
      let idx2 = this.renderData.findIndex(item => item.id === rowData.id);
      console.log(idx1, idx2);
      if (idx1 <= idx2) {
        this.renderData.splice(idx2 + currentCount.num + 1, 0, ...arr);
      } else {
        this.renderData.splice(idx2, 0, ...arr);
      }
      this.$emit("draggable-row", this.renderData);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值