使用js获取选中的dom元素 并改变选中(有序dom)的状态

文章介绍了如何在Vue项目中使用el-checkbox-group组件,并详细展示了如何处理鼠标悬停、点击和选择范围操作的事件处理方法。

一个效果图,一段代码, 就这样吧。
在这里插入图片描述

<template>
  <div
    ref="checkListRef"
    class="fizz-container h-full"
    @mouseup.stop="mouseupCon"
    @mousedown.stop="mousedownCon"
    @mouseover="mouseoverCon"
    @mouseout="mouseoutCon"
  >
    <el-checkbox-group :value="checkedList" class="user-select-auto">
      <el-checkbox
        v-for="(item, i) in checkArr"
        :key="item.id"
        :label="item.id"
        class="m-4"
        :data-index="i"
        @click.native.prevent.stop="checkItem(item.id)"
        >{{ item.label }}</el-checkbox
      >
    </el-checkbox-group>
  </div>
</template>

<script>
import { generateUUID } from '@/utils/utils'
const checkArr = new Array(200).fill(null).map((_, i) => {
  const id = generateUUID()
  return {
    id,
    value: id,
    label: i,
    checked: false,
  }
})
export default {
  data() {
    return {
      checkArr,
      checkedList: [],
      selectedIdList: [],
      isOver: false, // 是否在容器
      isDown: false, // 是否在容器按下状态
    }
  },
  methods: {
    mousedownCon() {
      this.isDown = true
    },
    mouseupCon() {
      if (this.isDown === false || this.isOver === false) {
        return
      }
      const sel = window.getSelection()
      console.log(sel)
      const { anchorNode, extentNode } = sel
      if (!anchorNode || !extentNode) {
        return
      }
      const { startIndex, endIndex } = this.getSEIndex(anchorNode, extentNode)
      if (startIndex === endIndex) {
        return
      }
      this.setChecked(startIndex, endIndex)
      this.isDown = false
      window.getSelection().removeAllRanges()
      this.selectedIdList = []
    },
    getSEIndex(anchorNode, extentNode) {
      let startDom = anchorNode
      let endDom = extentNode
      if (extentNode.classList && extentNode.classList.contains('el-checkbox__input')) {
        endDom = extentNode.parentElement
      } else if (extentNode.nodeName === '#text') {
        endDom = extentNode.parentElement.parentElement
      }
      if (anchorNode.classList && anchorNode.classList.contains('el-checkbox__input')) {
        startDom = anchorNode.parentElement
      } else if (anchorNode.nodeName === '#text') {
        startDom = anchorNode.parentElement.parentElement
      }

      let startIndex = Number(startDom.dataset.index)
      let endIndex = Number(endDom.dataset.index)
      if (parseInt(startIndex) > parseInt(endIndex)) {
        const temp = endIndex
        endIndex = startIndex
        startIndex = temp
      }
      return { startIndex, endIndex }
    },
    setChecked(startIndex, endIndex) {
      for (let i = startIndex; i < endIndex + 1; i++) {
        const id = this.checkArr[i].id
        const ind = this.checkedList.findIndex(x => x === id)
        if (ind > -1) {
          this.checkedList.splice(ind, 1)
        } else {
          this.checkedList.push(id)
        }
      }
      // const mergedArray = [...this.checkedList, ...this.selectedIdList].filter((value) => {
      //   return !array1.includes(value) || !array2.includes(value);
      // });

      // const mergedArray = [...new Set([...this.checkedList, ...this.selectedIdList])]
      // this.checkedList = mergedArray
    },
    mouseoutCon() {
      this.isOver = false
    },
    mouseoverCon() {
      this.isOver = true
    },
    checkItem(id) {
      const ind = this.checkedList.findIndex(x => x === id)
      if (ind > -1) {
        this.checkedList.splice(ind, 1)
      } else {
        this.checkedList.push(id)
      }
    },
  },
}
</script>
<style lang="less">
.el-checkbox {
  user-select: auto;
}
.user-select-none {
  user-select: none;
}
.user-select-auto {
  user-select: auto;
}
.el-checkbox__input {
  user-select: none;
}
.el-checkbox-group::selection {
  background-color: #fff;
  color: #206ef7;
}
.el-checkbox__label::selection {
  background: #fff;
  color: #206ef7;
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拿我格子衫来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值