首页
关于
留言
统计
更多
友链
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技术
移动端
服务端
经验思考
实习
工作
生活
页面
关于
留言
统计
友链
搜索到
52
篇与
西蒙
的结果
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 点赞
2023-02-02
ElasticSearch常用API查询语句
ElasticSearch作为海量数据存储和搜索查询工具,有着大量的API操作,这里总结下常用的API查询语句,方便使用。
2023年02月02日
21 阅读
0 评论
0 点赞
2022-12-31
2022,是时候总结了
2022,一个注定不平凡的一年。经历了疫情反复的折磨,从开放,到封控、再到开放,不管是国家、还是个人,都切切实实地感受到了疫情带来的无法磨灭的影响。2022,无论是国际上还是国内,都发生了各种各样的大事,每个人都是历史的见证者。我也深深感到,自己处于历史的洪流中,很多时候个人的力量是有限的,很多事情只能眼睁睁地看着发生。但同时放长远来看,每一个时代也只不过是历史沧海中的一粟,所以也就不必过于纠结,我反而醒悟了,要珍惜当下每一刻。个人来说,2022年最后一周在阳性中度过。反复发烧,不断咳嗽、刀片嗓、失去味觉、全身酸痛。。。各种症状体验了个遍。都说历史和经济都是周期性的,分久必合,合久必分,有涨有跌,周而复始。纵观2022一年,好像都是在一路down过来的,到最后还感染了新冠,实在没有更惨的方式来结束这一年了。但某种意义上来说,最难的一年是不是已经过去了呢?2022已经触底,2023是否会反弹?2023,我希望是刷新的一年,是好运开始的一年,所有霉运就都留在2022吧。
2022年12月31日
26 阅读
0 评论
0 点赞
2022-11-22
如何获取网页按键信息?
用户在网页上经常会有各种各样的操作,作为开发者来说,如果我们想分析用户在网页上到底按了哪些键,该如何去做呢?本文就来掰扯掰扯。
2022年11月22日
63 阅读
0 评论
1 点赞
2022-08-07
装修小记——全屋定制入门
最近准备开始装修精装房,所以记录下自己的装修生活,分享下经验教训。装修要了解的东西太多了,作为小白,本期先来了解下全屋定制。
2022年08月07日
75 阅读
0 评论
1 点赞
2022-05-31
从零开始配置Mac环境下的ITerm2
必备安装为了使用Mac的命令行安装工具wget,快捷下载软件,需要先安装brew和wgetbrew安装ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"wget安装brew install wget安装Oh-my-zsh方案一(推荐)打开终端命令行,用wget下载。sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"方案二手动下载源码:# 下载 oh-my-zsh 源码 git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh # 并且把 .zshrc 配置文件拷贝到根目录下 cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc # 让 .zshrc 配置文件生效 source ~/.zshrc修改.zshrc配置这个文件非常关键,是oh-my-zsh的配置文件,它的位置在根目录下,可以通过 vim ~/.zshrc 查看。每一次修改它之后,如果想要立即生效需要手动执行source ~/.zshrc。修改配色方案一打开 .zshrc,就可以看到关于配色方案的配置:# Set name of the theme to load --- if set to "random", it will # load a random theme each time oh-my-zsh is loaded, in which case, # to know which specific one was loaded, run: echo $RANDOM_THEME # See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes ZSH_THEME="agnoster"oh-my-zsh 提供了很多内置的配色方案,可以通过命令来查看:ls ~/.oh-my-zsh/themes也可以打开Themes更为直观的查看所有的配色方案。只要修改ZSH_THEME的值就可以设置对应的配色方案了。字体PowerFonts下载很多主题需要用到各种字体,默认的字体无法兼容,会出现乱码。到Fonts下载zip后解压,进行安装:# 新建一个iterm2目录 mkdir ~/Iterm2 # 将下载好的 fonts 移动到Iterm2目录 mv ~/Downlaods/fonts-master ~/Iterm2/fonts cd ~/Iterm2/fonts # 执行安装文件 ./install.sh 这样字体就安装好了,然后通过以下操作路径设置字体:菜单栏 -> Profiles -> Open Profiles -> Edit Profiles -> 选择 Text。这里根据喜好选择Powerline相关字体就好。Powerlevel10k这是一个强大的主题,可以对颜色、图标、界面等进行深入地定制化:安装clonep10k到oh-my-zsh。git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k # 或者用gitee加速 git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k然后修改~/.zshrc配置:ZSH_THEME="powerlevel10k/powerlevel10k"重启Iterm2,就可以开始配置主题了!或者通过命令p10k configure开始配置。会有一系列指示问题,大致如下:这个符号看起来像钻石(旋转的正方形)吗?这个符号看起来像锁吗?这个符号看起来像 Debian logo 吗?这些图标都交叉分布在 X 之间吗?风格编码是否显示时间目录层级分隔符头部(左边)尾部(右边)是否换行左边和右边是否有连接线命令行和提示是否连接两行命令之间分布稀疏还是松散是否需要图标经过一系列配置后,就可以开始愉快地使用了。更多高阶设置可以参考Github官方文档。插件主题配置好后,zsh的插件功能可以让我们用起来更加顺手。首先,我们先了解一下插件在 ~/.zshrc 的哪个位置,找到下面这个字段就不会错了:plugins=(git)gitgit 插件是自带插件,默认已经开启,它可以让我们使用非常骚好用的的 git 命令,提高开发效率:git 正常命令git 插件命令git add --allgaagit branch -DgbDgit commit -a -mgcamgit checkout -bgcbgit checkoutgcogit mergegmgit pullgl可以通过命令查看所有配置:vim ~/.oh-my-zsh/plugins/git/git.plugin.zsh自动跳转对应目录我们经常遇到目录特别复杂,cd的时候要输入半天,下面的插件可以帮助我们简化目录跳转。设置别名 alias打开~/.zshrc输入别名,比如:alias articles='~/Work/github/articles'然后执行articles就会自动跳到~/Work/github/articles了。这样的缺点是得为每个目录都配置 alias。autojump 插件autojump插件会记录你所有的访问记录,不同单独配置,直接访问即可。安装brew install autojump配置打开~/.zshrc加一行代码:[[ -s $(brew --prefix)/etc/profile.d/autojump.sh ]] && . $(brew --prefix)/etc/profile.d/autojump.sh然后执行source就生效了。使用使用j命令就可以执行auto-jump,比如j articles:前提是访问过 articles 目录,也就是你得让它记住。zsh-autosuggestions这个插件的作用很简单,就是像它名字一样,会在你输入命令的时候提示并且自动完成:brew install zsh-autosuggestionsVsCode配置如果我们要用VsCode的终端功能,需要把默认终端改成zsh,并且修改字体配置:{ "terminal.integrated.fontFamily": "MesloLGS NF" }最后到这就基本上大功告成了,可以使用Iterm2这个开发利器了。当然,这只是工具,还需要熟练各种命令才能提升开发效率。
2022年05月31日
106 阅读
0 评论
0 点赞
2022-05-26
NodeJs服务端POST请求如何拿到请求body的内容
当向NodeJs服务端发送POST请求时,发现拿到的request.body为空对象,发现请求的参数都没问题,但就是拿不到数据,这是为什么呢?让我们来一探究竟。
2022年05月26日
678 阅读
0 评论
0 点赞
2022-05-25
手把手教你ElasticSearch本地快速安装部署
Elasticsearch简介Elasticsearch 是一个分布式、可扩展、实时的搜索与数据分析引擎。 它能从项目一开始就赋予你的数据以搜索、分析和探索的能力,本篇教你如何在本地快速部署Elasticsearch服务。
2022年05月25日
174 阅读
0 评论
0 点赞
2022-03-19
你必须了解的Flutter原理
本文旨在记录分析Flutter的渲染原理和设计理念,参考了一些文档和博客,方便Flutter开发者学习交流。
2022年03月19日
125 阅读
0 评论
0 点赞
1
2
...
6