JS区域选择功能实现

本文介绍了如何使用JavaScript在HTML页面中的表格上实现鼠标拖拽选择功能,包括事件监听、位置计算和元素操作,以便动态改变选中单元格的样式。

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

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>

    </style>
</head>
<style>

</style>

<body>

    <table id="table" border="1" style="width: 300px; height: 200px;">
        <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
        </tr>
        <tr>
            <td>a</td>
            <td>b</td>
            <td>c</td>
            <td>d</td>
        </tr>
        <tr>
            <td>a</td>
            <td>b</td>
            <td>c</td>
            <td>d</td>
        </tr>
        <tr>
            <td>a</td>
            <td>b</td>
            <td>c</td>
            <td>d</td>
        </tr>
    </table>



</body>

</html>
<script>
    class copy {
        set = new Set()
        tableMD = false
        tableDom = null
        range = 2
        position = {
            beginX: 0,
            beginY: 0,
            endX: 0,
            endY: 0,
            computedX: 0,
            computedY: 0
        }
        constructor(dom = null) {
            this.tableDom = document.getElementById("table")
            this.registerEvent()
        }
        registerEvent() {
            const t = this;
            this.tableDom.addEventListener("mousedown", (e) => {
                event.preventDefault()
                t.cancelSelect()
                t.tableMD = true
                t.position.beginX = e.pageX
                t.position.beginY = e.pageY
                t.position.computedX = e.pageX
                t.position.computedY = e.pageY
            })
            t.tableDom.onmousemove = (e) => {
                event.preventDefault()
                t.position.endX = e.pageX
                t.position.endY = e.pageY
                t.position.computedX = t.position.beginX
                t.position.computedY = t.position.beginY
                if (t.tableMD) {
                    t.cancelSelect()
                    t.moveHandle(e)
                }
            }
            document.onmouseup = (e) => {
                const t = this
                t.tableMD = false
            }
        }
        moveHandle(e) {
            const t = this;
            const a = () => {
                t.position.computedX = t.position.beginX
                if (t.position.endY < t.position.beginY) {
                    t.position.computedY += (0 - t.range)
                    if (t.position.computedY < t.position.endY) { return false; }
                } else {
                    t.position.computedY += t.range
                    if (t.position.computedY > t.position.endY) { return false; }
                }
                return true
            }
            if (t.position.beginX > e.pageX) {
                // 左滑
                t.position.computedX += (0 - t.range)
                if (t.position.computedX > t.position.endX) {
                    t.addSet(t.position.computedX, t.position.computedY)
                    t.moveHandle(e)
                } else {
                    a() && t.moveHandle(e)
                }
            } else {
                // 右滑
                t.position.computedX += t.range
                if (t.position.computedX < t.position.endX) {
                    t.addSet(t.position.computedX, t.position.computedY)
                    t.moveHandle(e)
                } else {
                    a() && t.moveHandle(e)
                }
            }
        }
        cancelSelect = () => {
            const t = this;
            t.set.forEach(item => {
                item.style.background = "none"
            })
            t.set.clear()
        }
        addSet = (x, y) => {
            const t = this;
            var element = document.elementFromPoint(x, y)
            if (element.nodeName === "TD") {
                t.set.add(element)
                element.style.background = "red"
            }
        }
    }


    window.onload = function () {
        new copy().registerEvent()
    }

</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值