宝哥clipboard源码文章学习笔记

399 阅读3分钟

宝哥源码解读Clipboard.js笔记。https://juejin.cn/post/6906635620752293902

选要复制的元素:拖蓝

  • window.getSelection API 拖蓝效果,针对一个区域,firefox浏览器可多个
let selection = window.getSelection();
let range = selection.getRangeAt(0);//选中的第一个区域,range是选中的区域
  • 可以选择默认区域,也就是选择我们想要选择的任意区域,实现原理是创建一个新的选区,再将我们要选的区域添加进去,
<div>大家好,我是<strong>阿宝哥</strong>。欢迎关注<strong>全栈修仙之路</strong></div>
<script>
   let strongs = document.getElementsByTagName("strong");
   let s = window.getSelection();

   if (s.rangeCount > 0) s.removeAllRanges(); // 从选区中移除所有区域
   for (let i = 0; i < strongs.length; i++) {
     let range = document.createRange(); // 创建range区域
     range.selectNode(strongs[i]); // 让range区域包含指定节点及其内容
     s.addRange(range); // 将创建的区域添加到选区中
   }
</script>

小结:如果触发拖蓝,则移除所有选中,并且创建一个区域,再把特定内容添加进去,然后再放进选区

操作API: execCommand API

  • 该api允许命令来操作网页中的内容,该库使用此api进行复制和剪切功能,

  • Document.queryCommandSupported API:用于确认当前浏览器是否支持指令的编辑命令

ClipboardJS

  • 这个构造函数中有两个方法,一个listenClick一个 resolveOptions ,我们先看第一个,是用来监听click事件的

  • 当你点击时候,触发click事件,然后会触发onClick事件,这个事件会通过一个good-listen来添加事件处理器,然后会使用触发目标来创建一个ClipboardAction 对象,对象里面有选中的元素,发生的事件,其中的内容,触发的操作,和触发的事件对象等等

  • resolveOptions 就是在这个事件触发前,调用,初始化事件对象

ClipboardAction类

  • 首先会配置对象,然后有一个initSelection方法根据选中的内容,是文本还是对象选择不容的处理方式
  • 这个函数里面如果对象是普通的,就获取其中的值,如果是input框,就把他变成只读,

选中文本后,使用EXECommand来复制文本,复制完以后 handleResult 派发复制的状态信息

这里用的是this.emitter,也就是Clipboard实例,然后通过该实例监听对应的事件

另外一种情况,当用户要复制的是指定文本的时候

  • 会调用selectFake方法,创建一个假的textarea元素,并且设置该元素的样式和定位信息,然后还是用之前的拖蓝选择,然后复制,只是这个元素被隐藏了,

小结:

  • 通过拖蓝选择区域,可以直接选择,也可选择指定,选择指定就创建一个对象,把区域放进去,事件通过监听点击事件触发,触发后创建一个ClipboardAction 对象,这个对象包含要复制的信息,这个对象会被resolveOptions这个事件初始化,初始化阶段会分析要复制的对象是什么,如果是普通元素就获取其中的值,如果是input框,就会把它变成只读,然后拖蓝,0-字符长度的距离,然后复制,派发复制信息用来 事件派发,事件监听,