前端粘贴复制还能这样玩

简介: 前端粘贴复制还能这样玩

今天无意间发现了一个神奇的事件paste, 下面来介绍一下吧。


为了测试粘贴复制,下面我们先来写一个点击复制的工具函数


const clipboard = (text) => {
      return new Promise((resolve, reject) => {
        // 创建隐藏的 Textarea 标签,并将文本放入其中
        let textarea = document.createElement('textarea')
        textarea.style.position = 'absolute'
        textarea.style.top = '0'
        textarea.style.left = '0'
        textarea.style.border = 'none'
        textarea.style.margin = '0'
        textarea.style.padding = '0'
        textarea.style.opacity = '0'
        textarea.value = text
        document.body.appendChild(textarea)
        // 复制 Textarea 标签的文本
        textarea.select()
        document.execCommand('copy')
        // 移除 Textarea 标签
        document.body.removeChild(textarea)
        resolve()
      })
    }


paste事件:当用户在浏览器用户界面发起“粘贴”操作时,会触发 paste 事件。


这个只会作用于可输入文本的dom元素上。如果都不可输入,那么我们整个页面也是可以触发的。


下面来看一下例子。


<!DOCTYPE html>
    <!-- 即使给html设置了contenteditable设置了false,依旧是可以触发paste事件的-->
    <html lang="en" contenteditable="false">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <div>页面中没有可以可输入文本的dom元素</div>
      <script>
        document.addEventListener("paste", function(e) {
          console.log("e", e)
        })
      </script>
    </body>
    </html>


网络异常,图片无法展示
|


下面我们让div变成可以输入文本的dom。


<!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        div {
          width: 300px;
          height: 300px;
          background: skyblue;
        }
      </style>
    </head>
    <body>
      <div contenteditable="true">
        我是可输入文本的div
      </div>
      <script>
        const div = document.getElementsByTagName("div")[0]
        // 这个事件只作用于可编辑的dom元素上。
        // 如果元素都没有设置contenteditable="true",那么将作用于整个网页。
        div.addEventListener("paste", function(e) {
            console.log("e", e)
        })
      </script>
    </body>
    </html>


网络异常,图片无法展示
|


上面可以看出,只有光标聚焦到div元素上时执行粘贴行为时,才会触发paste事件。


开始的时候我只是想获取剪切板中粘贴的图片对象。就像掘金编辑器一样,平常就是在别的地方拷贝图片到文章中。


我们可以这样获取粘贴的图片对象。然后就可以上传到服务器了。


<!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <style>
        div {
          width: 300px;
          height: 300px;
          background: skyblue;
        }
      </style>
    </head>
    <body>
      <div contenteditable="true">
        我是可输入文本的div
      </div>
      <script>
        const div = document.getElementsByTagName("div")[0]
        // 这个事件只作用于可编辑的dom元素上。
        // 如果元素都没有设置contenteditable="true",那么将作用于整个网页。
        div.addEventListener("paste", function(e) {
          // 明明打印e.clipboardData.item没有值,但是最后获取getAsFile时,就可以打印出来。
          console.log("e:获取文件对象",e.clipboardData.items[0].getAsFile() )
        })
      </script>
    </body>
    </html>


网络异常,图片无法展示
|


那么获取文件对象会了,那么如何获取普通的复制的文本呢?


事件处理程序可以通过调用事件的 clipboardData 属性上的 getData()访问剪贴板内容。


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    div {
      width: 300px;
      height: 300px;
      background: skyblue;
    }
  </style>
</head>
<body>
  <div contenteditable="true">
    我是可输入文本的div
  </div>
  <p>点我复制</p>
  <script>
    const clipboard = (text) => {
      return new Promise((resolve, reject) => {
        // 创建隐藏的 Textarea 标签,并将文本放入其中
        let textarea = document.createElement('textarea')
        textarea.style.position = 'absolute'
        textarea.style.top = '0'
        textarea.style.left = '0'
        textarea.style.border = 'none'
        textarea.style.margin = '0'
        textarea.style.padding = '0'
        textarea.style.opacity = '0'
        textarea.value = text
        document.body.appendChild(textarea)
        // 复制 Textarea 标签的文本
        textarea.select()
        document.execCommand('copy')
        // 移除 Textarea 标签
        document.body.removeChild(textarea)
        resolve()
      })
    }
    const div = document.getElementsByTagName("div")[0]
    const p = document.getElementsByTagName("p")[0]
    // 这个事件只作用于可编辑的dom元素上。
    // 如果元素都没有设置contenteditable="true",那么将作用于整个网页。
    div.addEventListener("paste", function(e) {
      // 获取剪切板中的文本内容
      console.log("e: 获取文本",e.clipboardData.getData("text"))
    })
    // 点击div复制div中的内容到剪贴板
    p.addEventListener("click", function() {clipboard(p.innerText)})
  </script>
</body>
</html>


网络异常,图片无法展示
|


到此就结束啦,如果就得学到啦,就给一个小小的star,谢您们~


相关文章
|
移动开发 前端开发 iOS开发
记录一下前端H5的复制功能在ios端的兼容性问题
记录一下前端H5的复制功能在ios端的兼容性问题
720 0
|
前端开发
前端复制文本到剪切板(可换行)
前端复制文本到剪切板(可换行)
187 0
|
前端开发
前端禁止复制页面上的文字内容
前端禁止复制页面上的文字内容
51 0
|
前端开发
前端禁止鼠标右键、禁止全选、复制、粘贴
前端禁止鼠标右键、禁止全选、复制、粘贴
273 0
|
Web App开发 JavaScript 前端开发
前端er怎样操作剪切复制以及禁止复制+破解等
前言 有时候我们经常会碰到这些场景:玩掘金、知乎的时候复制一段文字,总是会在内容后面加上一些版权信息,以及像小说网站等都有禁止选中,禁止复制这种功能,还有点击自动复制账号的功能。 我也经常遇到这些场景,有时候会去想这后面到底是怎么做,周末趁着有空去研究了一下,然后发现这些都跟操作剪贴板有关系,并且都不难,了解一下基本都知道怎么做了,整理分享一波给大家。 个人博客了解一下:obkoro1.com 目录: API介绍 实现类知乎/掘金复制大段文本添加版权信息 实现类起点网的防复制功能 破解防复制 点击复制功能 API介绍: 复制、剪切、粘贴事件: copy 发生复制操作时触发;
467 0
前端er怎样操作剪切复制以及禁止复制+破解等
|
JavaScript 前端开发 数据安全/隐私保护
前端案例:简易登录表单的制作,包括用户名、密码、随机验证码(代码完整,复制即用)
前端案例:简易登录表单的制作,包括用户名、密码、随机验证码(代码完整,复制即用)
456 0
前端案例:简易登录表单的制作,包括用户名、密码、随机验证码(代码完整,复制即用)
|
9月前
|
Web App开发 前端开发 JavaScript
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
98 0
|
9月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-地图单线程配置
前端学习笔记202305学习笔记第二十三天-地图单线程配置
68 0
前端学习笔记202305学习笔记第二十三天-地图单线程配置