复制粘贴(一):copy paste 事件

news2024/11/19 7:32:30

页面内容如下:

<body>
	<div id="container1">
	  <p>阳光<input type="button" value="按钮" /><span>hello</span></p>
	</div>
</body>

在这里插入图片描述

选择所有内容:

在这里插入图片描述

user-select

按钮左右两侧的文字背景都变蓝了,但是按钮没有变。这是因为按钮的 user-select 默认值是 none

在这里插入图片描述
如果希望按钮也可以选择,手动设置 user-select

input[type="button"] {
    user-select: text;
}

此时再全选:

在这里插入图片描述

禁止复制

通过阻止默认事件来实现禁止复制

 // 禁止复制(ctrl+c ctrl+x shift+insert)
 container1.addEventListener("copy", (e) => {e.preventDefault();});
 // 禁止右键菜单
 container1.addEventListener("contextmenu", (e) => {e.preventDefault();});
 // 禁止选中文字
 container1.addEventListener("selectstart", (e) => {e.preventDefault();});

在 copy 事件中获取内容

copy 事件中获取 selection

 container1.addEventListener("copy", (e) => {
   const sel = window.getSelection();
   console.log(sel);
 });

在这里插入图片描述

selection.toString 获取选择区域中的纯文本

 container1.addEventListener("copy", (e) => { 
   const sel = window.getSelection();
   console.log(sel.toString()); // 输出'阳光hello'
 });

输出: 阳光hello(注意:虽然给按钮设置了 user-select,但是 toString() 中还是没有按钮的文本!)

如果要获取选中内容的 html 格式,用 cloneContents 获取 html

container1.addEventListener("copy", (e) => {
  const sel = window.getSelection();
  // console.log(sel().toString());	// 输出'阳光hello'
  const range = sel.getRangeAt(0); // TODO: getRangeAt(0) 什么意思
  console.log(range.cloneContents()); // 输出 document-fragment
}); 

输出:

在这里插入图片描述

在 copy 事件中修改内容

通过 e.clipboardData.setData 修改剪贴板内容(必须阻止 copy 默认事件)

container1.addEventListener("copy", (e) => {
  const sel = window.getSelection();
  const text = sel.toString();
  e.clipboardData.setData("text/plain", text + "-后缀");
  e.preventDefault(); // 必须要阻止默认事件
});

在 paste 中获取内容

通过 e.clipboardData.getData 获取内容

container1.addEventListener("paste", (e) => {
  // console.log(e.clipboardData.types); // 输出 ['text/plain', 'text/html']
  console.log(e.clipboardData.getData("text/plain"));
  console.log(e.clipboardData.getData("text/html"));
});

输出:

在这里插入图片描述
windows 系统用 clipboardData 获取 html 数据时,会自动包一层 html>body 和 startFragment,这个”特性“造成了 prosemirror 项目的 bug —— fix: prosemirror adds two extra spaces when paste。

下一篇文章会讲到用 navigator.clipboard.read 获取数据,用那个 API 拿到的 html 数据是纯净的,不会包 html>body 和 startFragment 标签。

在 paste 中修改内容

在 paste 阶段再想修改内容很麻烦,但有时候不得不这么做。

如果想要在用户从网站上复制内容时,末尾都追加上版权信息。这种情况可以在 copy 方法中修改内容。
但是如果在用户进行粘贴操作时,需要根据不同的目标区域有不同的修改策略,那么就只能在 paste 方法中处理了。

举例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
  </head>
  <body>
    <body>
      <section style="display: flex">
        <div
          style="height: 200px; background: pink; flex: 1"
          contenteditable="true"
          id="target1"
        ></div>
        <div
          style="height: 200px; background: blue; flex: 1"
          contenteditable="true"
          id="target2"
        ></div>
      </section>
    </body>
  </body>
</html>

在这里插入图片描述
希望在粉色区域粘贴时,加上后缀”-后缀1”。在灰色区域粘贴是,加上后缀“-后缀2”

要实现这个效果,只能阻止默认事件,然后自己执行 insertHTML

 target1.addEventListener("paste", (e) => {
   const text = e.clipboardData.getData("text/plain");
   document.execCommand("insertHTML", false, text + "-后缀1");
   e.preventDefault();
 });
 target2.addEventListener("paste", (e) => {
   const text = e.clipboardData.getData("text/plain");
   document.execCommand("insertHTML", false, text + "-后缀2");
   e.preventDefault();
 });

效果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码如何赋能实体经济走向数实融合

数字工厂、智慧园区、智慧社区、数字乡村、智慧校园、数字化管理平台……当前&#xff0c;各行各业正在全面拥抱数字化。“数实融合”的浪潮持续高涨&#xff0c;企业数字化转型的呼声也不断走高。然而&#xff0c;当前实体经济和数字经济融合不全&#xff0c;数字技术未能深度…

你可以永远相信铁死亡,4+机器学习+分型+实验的干湿结合机制

今天给同学们分享一篇铁死亡机器学习分型实验的生信文章“Identification of Ferroptosis-Related Biomarkers for Diagnosis and Molecular Classification of Staphylococcus aureus-Induced Osteomyelitis”&#xff0c;这篇文章于2023年4月26日发表在J Inflamm Res期刊上&a…

webpack快速入门

目录 1.概述 1.1.什么是webpack 1.2.loader 2.项目搭建 3.打包js&#xff1a; 4.打包CSS 5.打包图片 6.插件 1.概述 1.1.什么是webpack webpack是一个打包工具&#xff0c;其作用是对整个项目中的js、image、css进行打包。 传统的前端项目引用的第三方js或者css的时候…

DTI综述(更新中)

Deep Learning for drug repurposing&#xff1a;methods&#xff0c;datasets&#xff0c;and applications 综述读完&#xff0c;觉得少了点东西&#xff0c;自己写个DTI综述 Databases(包括但不限于文章中的) DATABASEDESCRIBEBindingDB有详细的drug信息和对应的target&a…

美国绿氢项目开发商NovoHydrogen完成2000万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国科罗拉多州戈尔登的绿氢项目开发商NovoHydrogen今日宣布已完成2000万美元融资。 本轮融资由现代能源公司领投。 该公司打算利用这笔资金进一步扩大其团队&#xff0c;并将其绿氢项目的…

页面路由跳转 - 文件 File对象数据传递

目录 需求主要问题点问题点2.1 演示问题点2.2 演示及解决页面B 处理1 - 有问题页面B 处理2 - 没有问题 - 最终解决办法 【补充】 file 对象转为 base64 文件&#xff08;即 将 file 对象转为 DataURL&#xff09; 需求 页面A填写完信息&#xff08;填写的信息中有上传的文件&am…

操作系统 —— 处理机调度与死锁

&#xff08;一&#xff09;简答题 1.高级调度与低级调度的主要任务是什么&#xff1f;为什么要引人中级调度&#xff1f; 参考答案&#xff1a; ①高级调度的对象是作业。它的主要任务是根据某种算法&#xff0c;决定 将外存上处于后备队列中的哪几个作业调入内存&#xff0c…

SW中的面部曲线命令

今天学习老王的画图教程中看到在使用面部曲线命令&#xff0c;找了变天没有&#xff0c;于是开始四处查找模式&#xff0c;终于在一个视频中看到了&#xff0c;原来不是在曲面命令中&#xff0c;而是在草图命令中&#xff0c;老王为了迷惑学员&#xff0c;把这个面部曲线命令放…

vite+vue3.0 使用tailwindcss

参考资料&#xff1a; 安装 - TailwindCSS中文文档 | TailwindCSS中文网 npm install -D tailwindcss npm install postcss npm install autoprefixer npx tailwindcss init -p 生成/src/tailwind.config.js和/src/postcss.config.js配置文件 在/src/tailwind.config.js配置文件…

【广州华锐互动】VR建筑安全培训体验为建筑行业人才培养提供有力支持

随着建筑行业的快速发展&#xff0c;建筑施工安全问题日益受到广泛关注。然而&#xff0c;传统的安全培训方式往往缺乏实践性和真实性&#xff0c;难以让员工真正掌握安全操作技能。近年来&#xff0c;虚拟现实(VR)技术的广泛应用为建筑施工安全培训提供了新的机遇。 虚拟现实技…

私有化部署助力企业信息安全,WorkPlus助您完美替代企微、钉钉、飞书!

在企业通讯领域&#xff0c;企业微信、钉钉和飞书等平台早已成为众多企业的首选。然而&#xff0c;对于一些企业来说&#xff0c;依赖公有云平台带来的数据安全和隐私问题仍然是一个隐患。因此&#xff0c;越来越多的企业开始关注私有化部署的解决方案。而在这个领域&#xff0…

JAVA转GO

GO 环境配置 go环境 下载go并安装(win下),环境变量他自己要配置上 https://dl.google.com/go/go1.21.3.windows-amd64.msi 验证是否安装成功: //打开cmd go versionVSCODE环境 下载VSCODE…略 配置VSCODE的环境 下载插件 go开发工具包 打开cmd,或者VSCODE自带的终端,…

OFDM基本原理

一、OFDM简述 OFDM 的全称是 Orthogonal Frequency Divisition Multiplexing&#xff0c;是一种多载波调制技术&#xff0c;其能有效对抗频率选择性衰落&#xff0c;克服信号符号间干扰。OFDM的技术的核心思想是将宽频率载波划分成多个带宽较小的正交子载波&#xff0c;并使用这…

2020年亚太杯APMCM数学建模大赛B题美国总统的经济影响分析求解全过程文档及程序

2020年亚太杯APMCM数学建模大赛 B题 美国总统的经济影响分析 原题再现&#xff1a; 美国总统选举每四年举行一次。 2020年是美国总统大选年&#xff0c;共和党候选人唐纳德特朗普和民主党对手乔拜登竞选总统。 甲乙双方候选人在金融贸易&#xff0c;经济金融治理&#xff0c;…

【嵌入式开发问答】不是普通的嵌入式八股

1. 进程、线程、堆栈、溢出 【问&#xff1a;】 进程的堆栈的物理内存是什么时候分配的&#xff1f; 堆栈的大小限制是多大&#xff1f;这个限制可以调整吗&#xff1f; 当堆栈发生溢出后应用程序会发生什么&#xff1f; 【答&#xff1a;】

七个开发者不可不知的VS Code小技巧

本文就来分享 7 个极大提高开发效率的 VS Code 技巧&#xff01; 目录 1.固定滚动&#xff08;Sticky Scroll&#xff09; 2.命令面板&#xff08;Command Palette&#xff09; 3.自定义代码片段&#xff08;Custom Snippets&#xff09; 4.文件查找&#xff08;File Finde…

软件测试方法分类

软件测试方法种类繁多&#xff0c;有白盒测试、黑盒测试、静态测试、动态测试、集成测试等等&#xff0c;记忆起来容易混乱&#xff0c;傻傻分不清楚&#xff0c;如果把软件测试方法进行分类, 就会清晰很多。现在小峰把常用的软件测试方法列出来&#xff0c;让大家更容易区分记…

百度发布文心大模型4.0,百度搜索实现重构;AI报告2023

&#x1f989; AI新闻 &#x1f680; 百度发布文心大模型4.0&#xff0c;百度搜索实现重构 摘要&#xff1a;10月17日&#xff0c;百度创始人李彦宏在百度世界2023上发布了文心大模型4.0&#xff0c;并开启邀请测试。这是迄今为止最强大的文心大模型&#xff0c;提升了理解、…

vue 自定义指令 -- 指令的值

vue 自定义指令 – 指令的值 **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day05\准备代码\05-自定义指令-指令的值 vue --vers…

HarmonyOS 语言基础类库开发指南上线啦!

语言基础类库提供哪些功能&#xff1f;多线程并发如何实现&#xff1f;TaskPool&#xff08;任务池&#xff09;和 Worker 在实现和使用场景上有何不同&#xff1f; 针对开发者关注的并发等语言基础类库的相关能力&#xff0c;我们在新推出的语言基础类库开发指南中提供了详细的…