前端模拟用户的复制操作
栏目: JavaScript · 发布时间: 5年前
内容简介:用户在浏览网页的过程中,执行复制操作的场景是非常多的,例如:复制链接地址、复制分享文案等等。而前端通过模拟用户的复制操作,可以减少操作的步骤,进而优化用户体验。复制操作主要分为以下两部分:
用户在浏览网页的过程中,执行复制操作的场景是非常多的,例如:复制链接地址、复制分享文案等等。
而前端通过模拟用户的复制操作,可以减少操作的步骤,进而优化用户体验。
复制操作主要分为以下两部分:
- 选中文本:对应用户通过鼠标或者触屏选中文本的操作。
- 操作系统剪贴板:对应用户按下 Ctrl(command) + C 的操作。
二、选中文本
首先,读者需要明白,不是所有的文本都可以被选中的(后续会提到),笔者这里先介绍几个可以选中文本的情况:
1、input 和 textarea
由于 input 元素的工作方式因其类型属性的值而有很大的差异,所以这里只讨论 text 的情况。
因为 JavaScript 提供了 HTTMLInputElement.select() 方法,所以选中 textarea 和 input 中的内容就变得非常简单:
document.querySelector('input').select() 复制代码
如果 input 和 textarea 元素附加了 disabled 属性,那么其内容是无法被选中的,这种情况最好是将 disabled 替换为 readonly 。
2、div
div 元素并没有开箱即用的 select() 方法,这就需要读者了解一个新的对象: Selection 。
Selection 对象表示用户选择文本的范围以及光标的范围。关于 Selection 对象,读者需要了解以下几个术语:
- 锚点:选区的起始点。
- 焦点:选区的终止点。
- 范围:文档中 连续 的一部分。
与 Selection 对象息息相关的还有一个 Range 对象,它主要用来自定义选区。对于这两个对象不了解的读者,可以查看文末给出的参考文献,接下来,利用 Selection 和 Range 对象实现上述 select() 方法:
function select (element) { const selection = window.getSelection() const range = document.createRange() range.selectNodeContents(element) selection.removeAllRanges() selection.addRange(range) } 复制代码
三、操作系统剪贴板
document 暴露的 execCommand 方法,可以用来运行操作系统提供的命令,并且这些命令大部分作用于 Selection 对象。
该方法返回的布尔值表示操作是否被支持或者是否被启用,但是调用一个命令之前,不能尝试使用返回值去校验浏览器的兼容性。
function copyText () { let success = true try { success = document.execCommand('copy') } catch (e) { success = false } return success } 复制代码
通过 execCommand 执行 copy 命令,可以将上述选中的文本添加到系统剪贴板中,接下来用户只需要在使用的地方按下 Ctrl(command) + V 即可粘贴该内容。
四、特殊情况的处理
上述方案基本上可以应对大部分的情况,但是在 HTML 中,部分元素中的文本是无法被选中的,例如:
<select id="js-select"> <option value="apple">apple</option> <option value="banana">banana</option> <option value="peach">peach</option> </select> 复制代码
既然 select 元素中的文本无法被选中,那么就无法调用 execCommand 方法,又何谈模拟用户复制该文本呢?
这里就需要采用以下套路:
1、获取需要复制的文本
首先获取到需要复制的文本内容,对于 select 元素,其文本内容可以根据 value 属性获取:
const element = document.getElementById('js-select') const text = element.value 复制代码
2、创建透明元素
前面提到的 input、textarea 等元素都是可以被选中的,所以这里笔者选择创建一个透明的 textarea 来实现接下来的功能:
function createFakerElement (text) { const fakerElement = document.createElement('textarea') fakerElement.style.position = 'absolute' fakerElement.style.left = '-9999px' fakerElement.value = text document.body.appendChild(fakerElement) return fakerElement } 复制代码
3、选中文本
前面也提到选中文本有两种方式:
- 对于 input、textarea 元素,可以直接调用其 select 方法。
- 对于大多数元素(input 和 textarea 元素就是特例之一),可以通过 Selection 和 Range 完成选中文本的操作。
由于上述创建的是 textarea,这里直接调用 select 方法:
function selectInput (element) { return element.select() } 复制代码
4、操作系统剪贴板
前文已经提及,这里不再赘述。
接下来只要按照顺序执行这些操作即可:
document.getElementById('js-button').addEventListener('click', () => { const element = document.getElementById('js-select') // 1、获取需要的文本内容 const text = element.value // 2、创建透明的 textarea 元素 const fakerElement = createFakerElement(text) // 3、选中相应的文本 selectInput(fakerElement) // 4、执行操作系统剪贴板的 copy 命令 const success = copyText() if (success) { console.log('复制成功') } else { console.log('复制失败') } document.body.removeChild(fakerElement) }, false) 复制代码
五、总结
由上文可知,前端模拟用户的复制操作主要涉及两方面的知识:
- 利用 Selection 和 Range 对象完成文本选中操作,比较特殊的是 input 和 textarea 元素自带 select 方法实现该操作。
- 通过 document.execCommand 方法调用 copy 命令将内容保存到系统剪贴板中。
其中 document.execCommand 方法主要作用于 Selection 对象,所以当元素无法被选中时,该复制命令则无法达到预期的效果。
前面也到了 disabled 属性以及 select 元素这样的特例,相比较下,通过创建一个透明的 textarea 来模拟复制操作的方案可用性更高。
参考文献
相关文章推荐
写在最后
如果本文对您有帮助,点个赞吧!也欢迎小伙伴们关注我的订阅号 漫谈大前端
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- MongoDB复制选举原理及复制集管理
- MySQL组复制MGR(二)-- 组复制搭建
- Redis系列(四):Redis的复制机制(主从复制)
- JavaScript中对象的浅复制和深复制 原 荐
- [跨地域复制系列](二) Apache Pulsar 的跨地域复制实践
- 数据库主从复制
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
莱昂氏UNIX源代码分析
(澳)John Lions / 尤晋元 / 机械工业出版社 / 2000-7-1 / 49.00
本书由上、下两篇组成。上篇为UNIX版本6的源代码,下篇是莱昂先生对UNIX操作系统版本6源代码的详细分析。本书语言简洁、透彻,曾作为未公开出版物广泛流传了二十多年,是一部杰出经典之作。本书适合UNIX操作系统编程人员、大专院校师生学习参考使用。一起来看看 《莱昂氏UNIX源代码分析》 这本书的介绍吧!