JS实现一键复制、选中复制、选中多行复制

文章介绍了如何使用JavaScript实现文本内容的快速复制,包括普通文本、选中区域复制,以及结合AntDesign的message组件提供复制成功的提示。

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

JS实现一键复制

首先我们准备一份通用的一键复制代码:

export function copyTextFun(text) {
    if (!text) return false
    var textarea = document.createElement('textarea') 
    textarea.value = text 
    document.body.appendChild(textarea) 
    textarea.select() 
    message.destroy()
    try {
        var successful = document.execCommand('copy') 
        if (successful) {
            console.log('成功')
        } else {
            console.log('失败')
        }
    } catch (err) {
        console.log('失败')
    } finally {
        document.body.removeChild(textarea) 
    }
}

上面的方法 就是传入文字,然后就可以实现复制,我们当然可以改造一下,改造成传入一个textarea元素,进入自动获取值,但是这个我们需要改造成获取textarea点击之后的事件对象,我们从中得到当前输入的值。

export function copyText(text) {
    if (!text) return false
    let newText = ''
    if (typeof text !== 'string') {
        newText = (text && text.target && text.target.value) || ''
    } else {
        newText = text
    }
    var textarea = document.createElement('textarea') //创建临时的textarea元素
    textarea.value = newText //将要复制的内容赋值给textarea
    document.body.appendChild(textarea) //将textarea添加到页面上
    textarea.select() //选中textarea中的内容
    message.destroy()
    try {
        var successful = document.execCommand('copy') //执行复制命令
        if (successful) {
            message.success('成功复制!')
        } else {
            message.error('无法复制!')
        }
    } catch (err) {
        message.error('无法复制!')
    } finally {
        document.body.removeChild(textarea) //移除临时的textarea元素
    }
}

message方法是使用的antd的组件,你们可以换成你们自己的提示组件。
使用很简单:

<TextArea onClick={copyText} readOnly rows={2} placeholder="请输入" />

这个时候我们已经可以实现点击复制当前文本框的内容,并提醒复制成功的消息弹窗。
但是我们还是不满足,有时候我们会自己想选择行的复制,拖黑选中的文字进行复制。

选中复制、选中多行复制

function getSelectedText() {
    let selectedText = ''
    if (window.getSelection) {
        // 检查浏览器是否支持 window.getSelection()
        selectedText = window.getSelection().toString() // 获取选中的文本并转换为字符串
    } else if (document.selection && document.selection.type !== 'Control') {
        selectedText = document.selection.createRange().text
    }
    return selectedText
}
export function copyText(text) {
    if (!text) return false
    let newText = ''
    if (typeof text !== 'string') {
        newText = (text && text.target && text.target.value) || ''
        if (!newText) return false
        const newGetSelectedText = getSelectedText()
        // 如果选中的文字在当前输入框中 直接复制当前选中的文字
        if (newGetSelectedText && newGetSelectedText.trim() && newText.includes(newGetSelectedText)) {
            newText = newGetSelectedText
        }
    } else {
        newText = text
    }
    var textarea = document.createElement('textarea') //创建临时的textarea元素
    textarea.value = newText //将要复制的内容赋值给textarea
    document.body.appendChild(textarea) //将textarea添加到页面上
    textarea.select() //选中textarea中的内容
    message.destroy()
    try {
        var successful = document.execCommand('copy') //执行复制命令
        if (successful) {
            message.success('成功复制!')
        } else {
            message.error('无法复制!')
        }
    } catch (err) {
        message.error('无法复制!')
    } finally {
        document.body.removeChild(textarea) //移除临时的textarea元素
    }
}

使用还是和上面的一致,但是我们做了处理,在有选中的时候,点击了就能复制当前拖黑的内容,无论你选中几行,单行还是多行还是几个字,都能实现复制。

点击 – 选中要复制的内容 – 开松鼠标 – 提示复制成功

好了 ,到这里 就完成了 这个小功能。

### Element UI `el-table` 组件中的行选中和全选功能 为了实现在 `el-table` 中的行选中以及全选操作,可以利用 `el-table-column` 的 `type="selection"` 属性来启用选择列。对于跨分页全选的需求,则需额外处理数据源与已选项之间的关系。 #### 基础配置 通过设置 `<el-table>` 和带有 `type="selection"` 类型的选择框列,能够使表格支持单行或多行记录的手动勾选: ```html <template> <div> <!-- 表格 --> <el-table ref="multipleTableRef" :data="tableData" style="width: 100%" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="date" label="日期" width="180"></el-table-column> <el-table-column prop="name" label="姓名" width="180"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> <!-- 底部工具栏 --> <span class="example-pagination-block"> <el-button size="small" @click="toggleSelectAll">切换全部</el-button> <el-button size="small" @click="clearSelections">清空选择</el-button> </span> </div> </template> ``` 此部分代码定义了一个基本结构用于展示列表并允许用户手动挑选特定条目[^2]。 #### 跨分页全选逻辑 当涉及到多个页面的数据时,简单的本地状态不足以跟踪所有被标记的对象。因此,在 Vuex 或者其他全局管理器的帮助下保存整个集合的状态变得至关重要。下面是一个简化版的方法概述: - 创建一个独立数组存储已被选中的 ID 列表。 - 当点击全选按钮时,遍历当前显示的数据集并将它们加入到上述提到的外部维护的ID列表里去。 - 对于取消全选的操作则相反,移除对应范围内的项目即可。 - 更新视图层面上的表现形式(即哪些行应该呈现为“已选中”的样式),这通常意味着同步更新内部缓存同实际渲染出来的DOM节点间的一致性。 具体实现细节会依赖于应用的具体架构设计和个人偏好,但核心思路保持不变[^1]。 #### 方法示例 以下是几个辅助函数的例子,用来控制选择行为: ```javascript <script setup lang="ts"> import { ref, onMounted } from 'vue'; const multipleTableRef = ref(null); let tableData = [ { date: "2016-05-03", name: "Tom", address: "No. 189, Grove St, Los Angeles" }, // ...更多模拟数据... ]; // 存储所有选中的id const selectedIds = new Set(); function handleSelectionChange(selection) { selection.forEach(item => { selectedIds.add(item.id); // 添加至Set集合 }); } function toggleSelectAll() { const allRows = [...Array(tableData.length).keys()].map(i => i + 1); if (selectedIds.size === allRows.length) { clearSelections(); } else { selectAllRows(allRows); } } function selectAllRows(rows) { rows.forEach(rowId => { const row = tableData.find(r => r.id === rowId); if (!selectedIds.has(row.id)) { selectedIds.add(row.id); multipleTableRef.value?.toggleRowSelection(row, true); } }); } function clearSelections() { selectedIds.clear(); // 清理set multipleTableRef.value?.clearSelection(); // 移除UI上的高亮 } </script> ``` 这段脚本展示了如何监听选择变化事件,并提供了两个主要的功能——一键全选/反向全选(`toggleSelectAll`)和清除现有选择(`clearSelections`)。注意这里假设每一条记录都有唯一的 `id` 字段以便追踪。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

六卿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值