首页
关于
留言
统计
更多
友链
Search
1
NodeJs服务端POST请求如何拿到请求body的内容
678 阅读
2
教你如何获取浏览器窗口大小
237 阅读
3
手把手教你ElasticSearch本地快速安装部署
174 阅读
4
clarity-js源码分析系列(三)之元素变化处理
174 阅读
5
你必须了解的Flutter原理
125 阅读
技术知识
网络
数据分析
算法
实用工具
前端技术
JS技术
CSS技术
Web技术
移动端
服务端
经验思考
实习
工作
生活
登录
/
注册
Search
标签搜索
js技巧
js原理
随笔
面经
css技巧
源码分析
前端监控
录制回放
http
函数
leetcode
盒模型
elasticsearch
codemirror
编辑器
markdown
nodejs
职业规划
二叉树
tcp
西蒙
累计撰写
52
篇文章
累计收到
0
条评论
首页
栏目
技术知识
网络
数据分析
算法
实用工具
前端技术
JS技术
CSS技术
Web技术
移动端
服务端
经验思考
实习
工作
生活
页面
关于
留言
统计
友链
搜索到
31
篇与
前端技术
的结果
2023-03-28
关于浏览器复制粘贴你不可不知的事
浏览器中的复制粘贴功能是我们经常使用的一种操作,它可以让我们快速地在不同的地方分享或转移文本、图片等内容。但是,你知道吗,JavaScript 也可以对浏览器的复制粘贴行为进行监听和控制,实现一些有趣或有用的功能。本文将从以下几个方面介绍:JavaScript 如何监听浏览器的复制粘贴行为如何点击按钮一键复制如何禁止用户复制如何给用户复制的内容加上文字水印JavaScript 如何监听浏览器的复制粘贴行为要监听浏览器的复制粘贴行为,我们可以使用以下几个事件:copy:当用户执行复制操作时触发,比如使用鼠标右键菜单或者按下 Ctrl+C 键cut:当用户执行剪切操作时触发,比如使用鼠标右键菜单或者按下 Ctrl+X 键paste:当用户执行粘贴操作时触发,比如使用鼠标右键菜单或者按下 Ctrl+V 键这些事件都有一个before事件对应,比如 beforecopy、beforecut、beforepaste,它们在相应的操作之前触发,可以用来阻止默认行为或者做一些预处理。这些事件都有一个event对象作为参数,其中有一个重要的属性叫 clipboardData,它是一个Clipboard对象,用于访问和修改剪贴板中的数据。Clipboard对象有两个方法:getData(type):用于获取指定类型的数据,比如 “text” 或 “image”setData(type, data):用于设置指定类型的数据,比如 “text” 或 “image”例如,我们可以这样监听全局的复制事件,并打印出复制的内容:document.body.oncopy = function(e) { // 获取 clipboardData 对象 let clipboardData = e.clipboardData || window.clipboardData; // 获取复制的文本 let text = clipboardData.getData("text"); // 打印出来 console.log(text); };如何点击按钮一键复制有时候,我们希望用户可以点击一个按钮就能把某些内容复制到剪贴板中,方便他们分享或使用。这时候,我们可以利用document.execCommand(command)方法来执行一些命令来操作可编辑内容区域的元素。其中有一个命令叫 “copy”,它可以把当前选中的内容复制到剪贴板中。例如,我们可以这样实现一个一键复制按钮:<body> <p id="text">这是要复制的内容</p> <button id="btn">点击复制</button> </body> <script type="text/javascript"> // 获取元素 let text = document.getElementById("text"); let btn = document.getElementById("btn"); // 给按钮添加点击事件 btn.onclick = function() { // 选中要复制的文本 window.getSelection().selectAllChildren(text); // 执行 copy 命令 document.execCommand("copy"); // 提示用户已经复制成功 alert("已经复制到剪贴板"); }; </script>如何禁止用户复制有时候,我们不希望用户可以复制网页上的内容,比如一些版权或隐私信息。这时候,我们可以利用beforecopy事件来阻止用户的复制行为。例如,我们可以这样实现一个禁止复制的段落:<body> <p id="text">这是不能复制的内容</p> </body> <script type="text/javascript"> // 获取元素 let text = document.getElementById("text"); // 给元素添加 beforecopy 事件 text.onbeforecopy = function(e) { // 阻止默认行为 e.preventDefault(); // 提示用户不能复制 alert("这是不能复制的内容"); }; </script>如何给用户复制的内容加上文字水印有时候,我们希望用户可以复制网页上的内容,但是又想给复制的内容加上一些文字水印,比如网站的名称或者版权声明。这时候,我们可以利用copy事件来修改剪贴板中的数据。例如,我们可以这样实现一个给复制的内容加上文字水印的段落:<body> <p id="text">这是可以复制的内容</p> </body> <script type="text/javascript"> // 获取元素 let text = document.getElementById("text"); // 给元素添加 copy 事件 text.oncopy = function(e) { // 获取 clipboardData 对象 let clipboardData = e.clipboardData || window.clipboardData; // 获取复制的文本 let text = clipboardData.getData("text"); // 给文本加上水印 text += "\n\n本文来自:https://www.example.com"; // 设置剪贴板中的数据 clipboardData.setData("text", text); // 提示用户已经复制成功 alert("已经复制到剪贴板"); }; </script>Navigator.clipboardnavigator.clipboard 是一个只读属性,它返回一个 Clipboard 对象,可以用来读写剪贴板的内容。它是 Clipboard API 的一部分,可以用来实现剪切、复制、粘贴的功能。要使用 navigator.clipboard 的方法,需要先获取用户的许可,可以通过 Permissions API来请求 “clipboard-read” 或 “clipboard-write” 的权限。navigator.clipboard 有以下几个方法:read():从剪贴板读取数据,返回一个 Promise 对象,解析为一个 DataTransfer 对象,包含多种类型的数据。readText():从剪贴板读取文本,返回一个 Promise 对象,解析为一个字符串。write(data):写入任意数据到剪贴板,接受一个 DataTransfer 对象作为参数,返回一个 Promise 对象。writeText(text):写入文本到剪贴板,接受一个字符串作为参数,返回一个 Promise 对象。例如,我们可以这样使用 navigator.clipboard 来复制和粘贴文本:// 复制文本到剪贴板 navigator.clipboard.writeText("Hello, world!") .then(() => { console.log("Text copied"); }) .catch((error) => { console.error("Copy failed", error); }); // 从剪贴板读取文本 navigator.clipboard.readText() .then((text) => { console.log("Text pasted", text); }) .catch((error) => { console.error("Paste failed", error); });navigator.clipboard 和 document.execCommand 都是可以用来操作剪贴板的 API,但是它们有以下几点不同:navigator.clipboard 是异步的,返回 Promise 对象,而 document.execCommand 是同步的,返回布尔值。navigator.clipboard 可以处理多种类型的数据,而 document.execCommand 只能处理文本。navigator.clipboard 需要用户的许可,而 document.execCommand 不需要。navigator.clipboard 可以在任何时候调用,而 document.execCommand 只能在用户交互的上下文中调用。navigator.clipboard 的优点是它更安全、更灵活、更现代,而且不会阻塞主线程。它的缺点是它需要用户的许可,而且浏览器的兼容性不是很好。document.execCommand 的优点是它不需要用户的许可,而且浏览器的兼容性比较好。它的缺点是它只能处理文本,而且可能在未来被废弃。不过目前大部分还是用document.execCommand来实现复制粘贴操作。通过以上内容,相信你对浏览器复制粘贴相关的操作可以更加得心应手了,如果还有更多相关的知识或者问题,欢迎留言讨论。
2023年03月28日
9 阅读
0 评论
1 点赞
2023-03-26
教你在浏览器如何通过JS下载文件
文件下载是一个非常常见的需求,但由于浏览器的安全策略的限制,我们通常只能通过一个额外的页面,访问某个文件的url来实现下载功能,但是这种用户体验非常不好。幸好,HTML 5里面为<a>标签添加了一个download的属性,我们可以轻易的利用它来实现下载功能,再也不需要用以前的方法了。要用js下载文件,我们需要先创建一个Blob对象,它是一个可以存储二进制数据的对象,可以用来表示任意类型的文件。我们可以用Blob构造函数来创建一个Blob对象,传入一个数组作为参数,数组中的每个元素都是一个ArrayBuffer、ArrayBufferView、Blob、DOMString等类型的对象。接下来,我们需要创建一个URL对象,它是一个可以表示任意资源的地址的对象。我们可以用URL.createObjectURL()方法来创建一个URL对象,传入一个Blob对象作为参数。最后,我们需要创建一个<a>标签,并设置它的href属性为URL对象,并设置它的download属性为想要保存的文件名。然后调用它的click()方法来触发下载。为了方便使用,我们可以把上述步骤封装成一个函数,接受三个参数:data、type和filename。data是要下载的文件内容,type是文件的MIME类型,filename是文件名。函数的实现如下:function downloadFile(data, type, filename) { // 创建Blob对象 const blob = new Blob([data], {type: type}); // 创建URL对象 const url = URL.createObjectURL(blob); // 创建a标签 const a = document.createElement("a"); a.href = url; a.download = filename; // 触发下载 a.click(); // 释放内存 URL.revokeObjectURL(url); }这样,我们就可以用这个函数来下载不同类型的文件了。这里下载pdf用到了npm库。// 下载txt文件 downloadFile("Hello World", "text/plain", "hello.txt"); // 下载csv文件 downloadFile("Name,Age\nAlice,20\nBob,21", "text/csv", "data.csv"); // 下载pdf文件 const doc = new jsPDF(); doc.text("Hello World", 10, 10); const data = doc.output(); downloadFile(data, "application/pdf", "hello.pdf");以上就是如何用js下载txt、表格、pdf文件的方法。希望对你有帮助。
2023年03月26日
12 阅读
0 评论
0 点赞
2022-11-22
如何获取网页按键信息?
用户在网页上经常会有各种各样的操作,作为开发者来说,如果我们想分析用户在网页上到底按了哪些键,该如何去做呢?本文就来掰扯掰扯。
2022年11月22日
63 阅读
0 评论
1 点赞
2022-05-26
NodeJs服务端POST请求如何拿到请求body的内容
当向NodeJs服务端发送POST请求时,发现拿到的request.body为空对象,发现请求的参数都没问题,但就是拿不到数据,这是为什么呢?让我们来一探究竟。
2022年05月26日
678 阅读
0 评论
0 点赞
2022-03-19
你必须了解的Flutter原理
本文旨在记录分析Flutter的渲染原理和设计理念,参考了一些文档和博客,方便Flutter开发者学习交流。
2022年03月19日
125 阅读
0 评论
0 点赞
2022-03-18
clarity-js源码分析系列(三)之元素变化处理
页面监控需要尽可能多地收集数据,这样才有可能还原出当时用户操作的真实场景。还原用户场景常见的有几种方法:逐帧截屏、记录DOM元素及其变化、录制视频。目前主流的用户行为监控方案都是用的记录DOM元素变化,主要优点是对用户基本上无感知,并且生成的数据量相比另外几种偏小,对性能的影响也不大。本篇我们就来深入分析下clarity在这块做了什么。
2022年03月18日
174 阅读
0 评论
0 点赞
2022-02-26
clarity-js源码分析系列(二)之数据处理
上一篇我们大概介绍了clarity各个模块的作用,本篇我想着重来了解下clarity在数据存储、日志上报、性能优化方面做的事情,并试着理清clarity整个的架构。
2022年02月26日
99 阅读
0 评论
1 点赞
2022-02-24
clarity-js源码分析系列(一)之代码模块
前端监控一直是前端不可或缺的一部分,这里我调研了微软的clarity,它们主要是针对用户的行为监控进行录制回放,并且能生成热力图分析。为了彻底搞清楚其中的原理,对clarity-js进行了源码分析。话不多说,直接开始!
2022年02月24日
113 阅读
0 评论
0 点赞
2019-02-15
快速实现标签条tab切换效果
现在的单页应用中,我们经常需要通过切换不同的标签条显示相应的内容,一般想到的方法就是通过DOM操作给标签条添加点击事件然后加载对应内容,那么,有没有方法可以基本靠HTML和CSS就能快速实现标签条切换效果呢?我们来看一看。
2019年02月15日
73 阅读
0 评论
0 点赞
2019-01-29
NodeJS不可不知的文件操作技巧
在使用NodeJS的时候,我们经常会遇到对文件进行查找、删除、增加内容等操作,还好NodeJS内置了fs模块,fs的API提供了一系列方法,通过它我们可以实现基本的文件操作,接下来我们就来见识见识。
2019年01月29日
95 阅读
0 评论
0 点赞
1
2
...
4