声明:今天分享的内容可以直接在控制台进行演示。我们先来思考几个问题。1.我随意点击了一个页面,没有留下任何痕迹。能不能捕捉到我刚才点击了哪个节点,鼠标落脚点在哪两个词之间(点击图片无效,本文只讨论文字的情况)?2、如何点击任意节点,选中并复制任意文本?3.如何用脚本控制你用鼠标选中的区域(控制选中范围的大小,起始位置)?以上三个问题,你能回答几个?这些问题都是与当前所选领域相关的知识点,这里我们将它们结合在一起谈谈。先普及一些关于文本选择范围的基础知识。主要涉及两个对象,Selection和Range。可以理解为Selection由Range组成。Selection代表鼠标在当前页面选中的区域对象。您可以使用window.getSelection()来获取Selection对象。可以在当前页面用鼠标选中一个范围,然后打开控制台,进入窗口。getSelection()可以打印出Selection对象。可以调用选择的toString方法,结果会打印出我们选择的文本内容。letselection=window.getSelection();console.log(selection.toString());selection有一个rangeCount属性,用来判断当前选择区域有多少个范围。重点是:当进入网页,或者刷新当前页面后,如果没有点击任何地方,selection的rangeCount值为0,一旦点击任何地方,rangCount的值变为1(你可以打开控制台在控制台测试)。所以这个可以用来判断当前页面是否被点击过。letselection=window.getSelection();if(selection.rangeCount==0){console.log('当前页面未被点击');}else{console.log('当前页面被点击');//获取当前选择中的范围。(在网页上手动选择范围只能有一个范围,使用脚本可以实现选择包含多个范围的情况。)让范围=selection.getRangeAt(0);}当我们知道当前页面被点击后,我们就可以判断点击了哪个节点。中间点击的是哪两个词。这时候会用到几个range属性,分别是startContainer、endContainer、startOffset、endOffset。我们先看看控制台打印出来的几个范围属性。collapsed:指示当前范围是否关闭。true表示当前范围的起点和终点在同一位置。其实就是当前页面没有选中的范围。也可以认为当前选择范围是一个点。commonAncestorContainer:共同祖先节点。如果当前选择范围是跨节点的,即我的起点在上一个div,终点在他兄弟节点div。此时,commonAncestorContainer代表它们的父节点(最近的公共祖先节点)。如果起点和终点在同一个div中,则该属性的值指向当前div。startContainer/endContainer:范围起点和终点所在的节点中。startOffset/endOffset:范围的起点和终点在当前容器中的偏移量,即在startContainer(或endContainer)中,起点(或终点)之前多少个字。结合上面四个属性,我们可以很容易的找到我们刚才点击的是哪个位置(如果只点击一次,collapsed值为true,startContainer和endContainer是一样的,startOffset和endOffset是相等的)这里,我们一开始提到的一个问题解决了.第一个问题理解后,后两个就变得很简单了。我们先看第三种,只是用了几个range的方法。只需设置范围的边界值即可。setStartAfter()setStartBefore()setEndAfter()setEndBefore()//以上四个方法用于设置范围的开始和结束位置,参数传入节点即可。setStart()setEnd()//上面两个方法有两个参数,第一个传入节点,第二个传入偏移量,即从当前节点开始的单词。注意:这里的节点指的是文本节点(nodeType为3的文本节点)。我们来看第二个问题。先选中一段文字,然后执行复制命令。//选择一段文本letdiv=document.getElementById('div');letselection=window.getSelection();letrange=document.createRange();range.selectNode(div);selection.removeAllRanges();选择。addRange(range);//执行复制命令document.execCommand('copy',false,null);这里有一个非常有用的方法,document.execCommand(),有兴趣的小伙伴们自己下来看看吧。不管你是小弟弟还是小妹妹,你觉得事情好吗?给一个喜欢,让我们走吧!
