前端实现复制粘贴功能

在前端开发的世界里,复制粘贴功能就像是那个总是被忽视,却在关键时刻能救你一命的老朋友。我们习惯了用那些古老的魔法咒语(document.execCommand('copy'))来实现这一功能,但时代在进步,技术在更新,是时候告别那些让人头疼的兼容性问题,迎接新时代的剪贴板API了。

旧时代的遗物

在那个遥远的时代,我们为了实现复制粘贴功能:

  1. 不得不创建一个神秘的textarea元素,

  2. 然后让它隐形(通过CSS隐藏)

  3. 给它赋予力量(设置值)

  4. 将它召唤到页面的某个角落,然后通过古老的仪式(调用select方法和execCommand

  5. 最后在一切完成之后,让它消失在历史的长河中(移除元素)。

代码如下:

 // 创建一个临时的 textarea 元素const textarea = document.createElement('textarea');// 设置 textarea 的内容textarea.value = inputElement.value;// 防止在页面上显示 textareatextarea.setAttribute('readonly', '');textarea.style.position = 'absolute';textarea.style.left = '-9999px';// 将 textarea 添加到页面中document.body.appendChild(textarea);// 选中 textarea 的内容textarea.select();// 尝试执行复制操作const success = document.execCommand('copy');// 移除 textarea 元素document.body.removeChild(textarea);// 根据复制操作的成功与否给出提示if (success) {alert('复制成功!');} else {alert('复制失败,请手动复制。');}

这个过程虽然繁琐,但在当时,它是我们唯一的选择。

新时代的使者

随着navigator.clipboard API的诞生,我们终于可以告别那些复杂的仪式。这个API提供了两个强大的方法:writeTextreadTextwriteText方法允许我们异步地将文本写入剪贴板,而readText则可以读取剪贴板中的文本。这两个方法的使用非常简单,只需要几行代码,就可以实现复制和粘贴的功能。

复制功能的实现

const copyText = async (text) => {try {await navigator.clipboard.writeText(text);console.log('复制成功!');} catch (err) {console.error('无法复制: ', err);}
};

粘贴功能的实现

const pasteText = async () => {try {const text = await navigator.clipboard.readText();console.log('粘贴成功: ', text);} catch (err) {console.error('无法粘贴: ', err);}
};

兼容性与挑战

Navigator 这种新 API 都是需要事先授予权限的,而权限是通过 Permissions API 获取的。这时候,我们需要用户明确授权。

虽然新API带来了便利,但它并不是万能的。在某些环境下,比如安卓的 WebView,我们可能会遇到权限问题。

Permissions API MDN

注意 Permissions API 在安卓的 WebView 中是没实现的。很多小伙伴都容易在这里栽跟头

此时,为了兼容,我们可以在代码里加一个Permissions API的判断, 例如:

if (navigator.clipboard && navigator.permissions) { await navigator.clipboard.writeText(val) 
}

结语

随着技术的发展,我们有理由相信,未来会有更多简单、强大、兼容性更好的API出现。但在那之前,让我们拥抱navigator.clipboard,享受它带来的便利,同时也不忘那些曾经陪伴我们度过难关的老方法。毕竟,navigator.clipboard 在一些特别的情况下表现得不那么优秀,我们可以结合二者来实现一个,在各种情况下都通用的“复制粘贴”:

const copyText = async (val) => {try {// 使用现代 API 尝试复制if (navigator.clipboard && navigator.permissions) {await navigator.clipboard.writeText(val);return; // 如果成功,直接返回}// 降级方案const textArea = document.createElement('textArea') textArea.value = val textArea.style.width = 0 textArea.style.position = 'fixed' textArea.style.left = '-999px' textArea.style.top = '10px' textArea.setAttribute('readonly', 'readonly')document.body.appendChild(textArea) textArea.select()// 尝试执行复制操作const success = document.execCommand('copy');if (!success) {throw new Error('无法复制文本');}// 清理document.body.removeChild(textArea);} catch (err) {console.error('复制失败:', err);}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/536096.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第七天| 454.四数相加II、383.赎金信、15.三数之和、18.四数之和

系列文章目录 目录 系列文章目录454.四数相加II使用HashMap法 383.赎金信哈希解法(数组) 15.三数之和双指针法 18.四数之和双指针法 454.四数相加II 题解:该题和1.两数之和的方法是一样的,这个题的难点在于key和value分别是什么。…

【Linux】-Linux下的软件商店yum工具介绍(linux和windows互传文件仅仅一个拖拽搞定!!!!)

目录 1.Linux 软件包管理器yum 1.1快速认识yum 1.2 yumz下载方式(如何使用yum进行下载,注意下载一定要是root用户或者白名单用户(可提权)) 1.2.1下载小工具rzsz 1.2.2 rzsz使用 1.2.2查看软件包 1.3软件的卸载 2.yum生…

C语言 指针(5) 数组和指针题解析

目录 前言 一、sizeof和strlen 二、数组和指针笔试题解析 2.1、一维数组 2.2 字符数组 2.3 二维数组 三、指针运算笔试题解析 总结 前言 今天我们继续来了解指针,讲一下sizeof和strlen的区别,数组和指针题解析 一、sizeof和strlen 我们之前在讲…

跨境电子商务支付与结算的支撑系统

​1、跨境电子商务支付与结算的核心系统。 核心系统是用户执行跨境电子商务支付的核心模块,包括以下具体流程。 ​ ​①用户从跨境电子商务支付应用启动跨境电子商务支付流程。 ②跨境电子商务支付应用根据应用和用户选择的支付工具,来调用对应的支付产…

与鲸同行,智领未来!和鲸科技高校市场渠道合作伙伴正式开启招募

AI 浪潮来袭,技术日新月异,校企合作已成为高校培养符合产业需求的应用型人才、加速科研创新与成果转化的关键途径。从单一应用到多元化布局,各企业更需要技术领先、战略协同的领域伙伴协力共进。 和鲸科技以“协同平台实践社区竞赛”三位一体…

【数据结构】Set的使用

文章目录 一、Set的使用1.Set的常用方法&#xff1a;1.boolean add(E e)2.void clear()3.boolean contains(Object o)4.boolean remove(Object o)5.int size()6.boolean isEmpty()7.Object[] toArray()8.boolean containsAll(Collection<?> c)9.boolean addAll(Collecti…

C语言函数—关于静态库

具体的函数声明和定义请参考上一篇文章 如果我们成为了库的开发者&#xff0c;要卖给别人C语言库&#xff0c;该怎么办呢&#xff1f; A不会写减法&#xff0c;想找你买一个函数 但是&#xff0c;他给的太少了&#xff0c;你不想把源码卖给他 那怎么办呢&#xff1f; 首先&…

Android SDK 开发 云托管

开发SDK,拒绝重复造轮子。 本文陈述两种SDK开发方式&#xff0c;第一种AAR方式&#xff1b;第二种远程依赖方式。 具体步骤分为&#xff1a; 一、如何开发SDK&#xff1f; 二、如何打包AAR&#xff1f; 三、如何打包AAR&#xff1f; 四、如何进行SDK远程托管&#xff1f; 五、如…

【JavaScript】数据类型转换 ① ( 隐式转换 和 显式转换 | 常用的 数据类型转换 | 转为 字符串类型 方法 )

文章目录 一、 JavaScript 数据类型转换1、数据类型转换2、隐式转换 和 显式转换3、常用的 数据类型转换4、转为 字符串类型 方法 一、 JavaScript 数据类型转换 1、数据类型转换 在 网页端 使用 HTML 表单 和 浏览器输入框 prompt 函数 , 接收的数据 是 字符串类型 变量 , 该…

java拷贝数组

package com.mohuanan.exercise;public class Exercise {public static void main(String[] args) {int[] arr {1, 2, 3, 4, 5, 6, 7, 8, 8}; //格式化快捷键 CTRL 加 Alt 加 L键// F1截图 F3贴图//调用 copyOfRangeint[] ints copyOfRange(arr, 3, 7);for (int i 0; i &l…

【C++】string类初步介绍

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 为什么学习string类1.1 C语言中的字符串1.2 推荐学习网站 2. 标准库中的string类2.1 string类2.2 string类的常用接口说明2.2.1 constructor2.2.2 遍历string2.2.2.1 下标加[]遍历2.2.2.2 迭代器&#xff08;itera…

前端跨页面通信的几种方式---同源

参考链接 1、LocalStorage:当 LocalStorage 变化时&#xff0c;会触发storage事件。利用这个特性&#xff0c;我们可以在发送消息时&#xff0c;把消息写入到某个 LocalStorage 中&#xff1b;然后在各个页面内&#xff0c;通过监听storage事件即可收到通知。 2、BroadCast C…