1.获取用户网页选中内容

<p>4月13日消息,据台湾媒体报道,32岁的孙燕姿(Sng Ee Tze)和后天将满34岁的荷兰籍印度尼西亚男友纳迪姆(Nadim Van Der Ros)交往5年,曾说过"有空就结婚"的她,果然趁着宣传期尾声,于3月31日在新加坡登记注册了!昨消息传开,她未否认,仅说会选择适当时间公布喜讯,所属"美妙音乐"则表示她个性低调,婚礼只会邀请双方亲友,也不会透露细节,但据新加坡可靠消息指出,婚宴订在5月初。</p>
<button id="button">选中一些文字,然后点击本按钮</button>
JS代码:
<script>//获取网页中选中内容var oBtn = document.getElementById("button"); oBtn.onclick = function () {var userSelection, text;if (window.getSelection) { //现代浏览器
            userSelection = window.getSelection();} else if (document.selection) { //IE浏览器 考虑到Opera,应该放在后面
            userSelection = document.selection.createRange();} if (!(text = userSelection.text)) {text = userSelection;}alert(text);};
</script>

一:Range对象的概念

Range对象代表页面上一段连续的区域,通过Range对象可以获取或者修改页面上任何区域的内容。也可以通过Range的方法进行复制和移动页面任何区域的元素。
在Js的document文档中有一个方法用来创建一个Range对象,代码如下:

var  range = document.createRange();

在html5中,每一个浏览器窗口都会有一个selection对象,代表用户鼠标在页面中所选取的区域,(注意:经过测试IE9以下的浏览器不支持Selection对象), 可以通过如下语句创建selection对象;

var  selection = document.getSelection();
或者
var  selection  = window.getSelection(); 

每一个selection对象都有一个或者多个Range对象,每一个range对象代表用户鼠标所选取范围内的一段连续区域,在firefox中,可以通过ctrl键可以选取多个连续的区域,因此在firefox中一个selection对象有多个range对象,在其他浏览器中,用户只能选取一段连续的区域,因此只有一个range对象。
可以通过selection对象的getRangeAt方法来获取selection对象的某个Range对象,如下:
getRangeAt方法有一个参数index,代表该Range对象的序列号;我们可以通过Selection对象的rangeCount参数的值判断用户是否选取了内容;
1.当用户没有按下鼠标时候,该参数的值为0.
2.当用户按下鼠标的时候,该参数值为1.
3.当用户使用鼠标同时按住ctrl键时选取了一个或者多个区域时候,该参数值代表用户选取区域的数量。
4.当用户取消区域的选取时,该属性值为1,代表页面上存在一个空的Range对象;
测试代码如下:

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>meter</title> </head> <body> <script> function rangeTest() { var html, showRangeDiv = document.getElementById("showRange"), selection = document.getSelection(); if(selection.rangeCount > 0) { html = "你选取了" + selection.rangeCount + "段内容<br/>"; for(var i = 0; i < selection.rangeCount; i++) { var range = selection.getRangeAt(i); html += "第" + (i + 1) + "段内容为:" + range + "<br/>"; } showRangeDiv.innerHTML = html; } } </script> <h3>selection对象与range对象的使用实例</h3> <input type="button" value="点击我" onclick="rangeTest()"/> <div id="showRange"></div> </body> </html> 

效果:

range_selection.png

二:Range对象的属性和方法

(1)属性

startContainer
包含“起点”的节点。“包含”的意思是起点所属的节点。
endContainer
包含“结束点”的节点
startOffset
“起点”在startContainer中的偏移量。
如果startContainer是文本节点、注释节点或CDATA节点,则返回“起点”在startContainer中字符偏移量。
如果startContainer是元素节点,则返回“起点”在startContainer.childNodes中的次序。

<p id="p1"><span>span</span><b id="b1">Hello</b> World</p> <script type="text/javascript"> var oP1 = document.getElementById('p1') ; var oB1 = document.getElementById('b1'); var oRange = document.createRange(); oRange.setStart(oB1.firstChild, 2); // 设置range的“起点” oRange.setEnd(oP1.lastChild, 3); // 设置range的“结束点” alert(oRange.startOffset); // 2,可看到“起点”在<b id="b1">Hello</b>应是第三个字符。 alert(oRange.startContainer); // 元素oB1.firstChild,文本节点</script> 

collapsed:
起点和结束点在一起时为true;Range对象为空(刚createRange()时)也为true。
commonAncestorContainer
第一个包含Range的节点,同时包含起点和结束点。

(2)定位(设置“起点”和“结束点”)的一些方法

setStart(node, offset)和setEnd(node, offset)
setStart:设置起点的位置,node是对startContainer的引用,偏移则是startOffset;
setEnd:设置结束点的位置,node是对endContainer的引用,偏移则是startOffset;
代码如下:

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>range3</title> <script> function deleteChar() { var div = document.getElementById("myDiv"); var textNode = div.firstChild; var rangeObj = document.createRange(); rangeObj.setStart(textNode,1); rangeObj.setEnd(textNode,4); rangeObj.deleteContents(); } </script> </head> <body> <div id="myDiv" style="color:red">这段文字是用来删除的</div> <button onclick="deleteChar()">删除文字</button> </body> </html> 

setStartBefore(referenceNode)、setStartAfter(referenceNode)
setEndBefore(referenceNode)、setEndAfter(referenceNode)

setStartBefore:将“起点”设置到referenceNode前
setStartAfter:将“起点”设置到referenceNode后
setEndBefore:将“结束点”设置到referenceNode前
setEndAfter:将“结束点”设置到referenceNode后
注意:使用这四个方法设置的“起点”或“结束点”的父节点与referenceNode的父节点是同一个元素。
代码如下:

<!DOCTYPE html>
<html><head> <meta charset="utf-8"> <title></title> <script type="application/javascript"> function delrow(){ var table=document.getElementById("mytable"); if(table.rows.length>0){ var row=table.rows[0]; var rangeObj=document.createRange(); rangeObj.setStartBefore(row); rangeObj.setEndAfter(row); rangeObj.deleteContents(); } } </script> </head> <body> <table id="mytable" border="1"> <tr> <td>内容1</td> <td>内容2</td> </tr> <tr> <td>内容3</td> <td>内容4</td> </tr> </table> <button onclick="delrow()">删除第一行</button> </body> </html> 

selectNode(referenceNode)和selectNodeContents(referenceNode)
selectNode:设置Range的范围,包括referenceNode和它的所有后代(子孙)节点。
selectNodeContents:设置Range的范围,包括它的所有后代节点。
二者的区别:

range_selection.png

(3)修改范围的方法

cloneRange()
cloneRange()方法将返回一个当前Range的副本,它也是Range对象。
注意它和cloneContents()的区别在于返回值不同,一个是HTML片段,一个是Range对象 。代码如下:

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>meter</title> </head> <body> <p id="p">这里是随便书写的内容</p> <button onclick="cloneRange()">克隆</button> </body> <script> function cloneRange() { var rangeObj = document.createRange(); rangeObj.selectNodeContents(document.getElementById("p")); var rangeClone = rangeObj.cloneRange(); alert(rangeClone.toString()); } </script> </html> 

cloneContents()
可以克隆选中Range的fragment并返回改fragment。这个方法类似extractContents(),但不是删除,而是克隆。代码如下:

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>meter</title> </head> <body> <p id="p">这里是随便书写的内容</p> <button onclick="cloneContents()">克隆</button> </body> <script> function cloneContents() { var rangeObj = document.createRange(); rangeObj.selectNodeContents(document.getElementById("p")); var rangeClone = rangeObj.cloneContents(); alert(rangeClone.toString()); } </script> </html> 

deleteContents()
从Dom中删除Range选中的fragment。注意该函数没有返回值(实际上为undefined)。
代码如下:

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>meter</title> </head> <body> <p id="p">这里是随便书写的内容</p> <button onclick="delRange()">删除</button> </body> <script> function delRange() { var rangeObj = document.createRange(); rangeObj.selectNodeContents(document.getElementById("p")); var rangeClone = rangeObj.deleteContents(); } </script> </html> 

extractContents()
将选中的Range从DOM树中移到一个fragment中,并返回此fragment。代码如下:

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>meter</title> </head> <body> <div id="srcDiv" style="background-color:aquamarine;width:300px;height:50px;">你好吗?</div> <div id="distDiv" style="background-color:bisque;width:300px;height:50px"></div> <button onclick="moveContent()">移动元素</button> </body> <script> function moveContent() { var srcDiv = document.getElementById("srcDiv"); var distDiv = document.getElementById("distDiv"); var rangeObj = document.createRange(); rangeObj.selectNodeContents(srcDiv); var docFrangMent = rangeObj.extractContents(); distDiv.appendChild(docFrangMent); } </script> </html> 

insertNode
insertNode方法可以插入一个节点到Range中,注意会插入到Range的“起点”。代码如下:

<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>meter</title> </head> <body> <p id="p1"><b>Hello</b> World</p> </body> <script> var oP1 = document.getElementById("p1"); var oHello = oP1.firstChild.firstChild; var oWorld = oP1.lastChild; var oRange = document.createRange(); var oSpan = document.createElement("span"); oSpan.appendChild(document.createTextNode("Inserted text")); oRange.setStart(oHello, 2); oRange.setEnd(oWorld, 3); oRange.insertNode(oSpan); </script> </html> 

compareBoundaryPoints()

var compare = comparerange.compareBoundaryPoints(how, sourceRange);

compare:返回1, 0, -1.(0为相等,1为时,comparerange在sourceRange之后,-1为comparerange在sourceRange之前)。
how:比较哪些边界点,为常数。
Range.START_TO_START - 比较两个 Range 节点的开始点
Range.END_TO_END - 比较两个 Range 节点的结束点
Range.START_TO_END - 用 sourceRange 的开始点与当前范围的结束点比较
Range.END_TO_START - 用 sourceRange 的结束点与当前范围的开始点比较
sourceRange:个Range对象的边界。
detach()
虽然GC(垃圾收集器)会将其收集,但用detach()释放range对象是一个好习惯。语法为:oRange.detach();
toString()
返回该范围表示的文档区域的纯文本内容,不包含任何标签;

作者:便U_Life
链接:https://www.jianshu.com/p/ad2f818cc3b0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考文档:

https://www.jianshu.com/p/ad2f818cc3b0

http://www.zhangxinxu.com/wordpress/2011/04/js-range-html%E6%96%87%E6%A1%A3%E6%96%87%E5%AD%97%E5%86%85%E5%AE%B9%E9%80%89%E4%B8%AD%E3%80%81%E5%BA%93%E5%8F%8A%E5%BA%94%E7%94%A8%E4%BB%8B%E7%BB%8D/

转载于:https://www.cnblogs.com/tianma3798/p/8654125.html

JS Range使用整理相关推荐

  1. three.js学习资料整理

    最近在学three.js,特地整理偶然间碰到的学习资料分享给大家,国内除了大公司,专门学习three.js的太少了,普通的业务前端学它并不会增大面试成功率,又经常加班,react vue新特性,原理都 ...

  2. JS正则表达式大全(整理详细且实用)

    JS正则表达式大全(整理详细且实用) 作者: 字体:[增加 减小] 类型:转载 时间:2013-11-14 我要评论 JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助 ...

  3. js入门笔记整理(二)——操作符

    上一篇:js入门笔记整理 一元操作符 递增 递增分为前置递增和后置递增 前置型--两个加号(++)放在前面 var num = 1;++num; 这个操作其实就是给num加1,上面的列子等效于: va ...

  4. Auto.js 全命令整理(三) 输出专题

    Auto.js 全命令整理(三) 输出专题 目录 Auto.js 全命令整理(三) 输出专题 Console Toast Dialogs 末 各种输出方法,让你了解程序现在在干什么- Console ...

  5. Auto.js 全命令整理(二) 对应用命令专题

    Auto.js 全命令整理(二) 对应用命令专题 目录 Auto.js 全命令整理(二) 对应用命令专题 对应用命令 回顾-应用数据获取 末 对应用命令主要用于确认屏幕显示的是否是正确的页面,so,并 ...

  6. SVG.js 文本绘制整理

    1.SVG.Text var draw = SVG('svg1').size(300, 300); //画文字内容展示 //var text = draw.text('中文内容测试\n换行处理'); ...

  7. android给数组添加新元素_重磅!超详细的 JS 数组方法整理出来了

    作者:Yushiahttps://juejin.cn/post/6907109642917117965 数组是 js 中最常用到的数据集合,其内置的方法有很多,熟练掌握这些方法,可以有效的提高我们的工 ...

  8. Auto.js 全命令整理(一) 数据获取专题

    Auto.js 命令&作用(一) 信息获取专题 目录 Auto.js 命令&作用(一) 信息获取专题 应用信息获取 系统信息获取 设备信息获取 文件信息获取 色彩信息获取 随机数获取 ...

  9. js range 对象研究

    range对象  光标对象 他有4个常用属性 startContainer startoffset endContainer endoffset 举个例子 range :  span 1  div   ...

  10. JS.代码格式化(整理、美化)

    1.baidu搜索 "javascript 代码 格式化" 2. 2.1.jsDecoder JavaScript 格式化整理工具.html(http://tools.jb51.n ...

最新文章

  1. 图解GPT-2(完整版)!
  2. ssm read time out的原因_有高血压的人,认清这4点,很多高血压一直降不下来,原因在这里...
  3. docker技术剖析--docker资源限制及应用总结 for centos7.2
  4. keras fine-tune方法
  5. UOJ#419. 【集训队作业2018】圆形(格林公式)
  6. WordPress Citizen Space插件跨站请求伪造漏洞
  7. 【Python爬虫】入门知识
  8. Java kryo/protobuf/protostuff序列化 or Json 性能对比
  9. java盘点系统_2020年度综合大盘点:火爆IT业的7大Java技术,任何一项都是“卧槽牛逼”!...
  10. MySQL 语句使用到的关键字 函数 记录
  11. Delphi基础教程图文版之数组
  12. 2020年系统集成项目管理工程师课教程
  13. ISweek工采网·工采电子参展OFweek维科网 2021全球数字经济产业大会圆满落幕
  14. cmd无法打开jupyter notebook问题
  15. 用Python手把手教你做一只口红色号识别器,秒变李佳琦
  16. centos7利用docker 快速搭建苹果CMS站点
  17. ps4帧数测试软件,《地平线:零之黎明》PS4/Pro帧数测试 优化极佳
  18. 【Qt】Qt在Win系统上的消息通知
  19. 临终的悲剧——————抢救最后一口气
  20. 珍爱网服务怎么样?我的真实经历告诉你!

热门文章

  1. JProfiler11安装,选择IDE
  2. WORD中如何进行双行合一
  3. FFMpeg编译支持NVidia CODEC(成功)
  4. 检查了一下同事工作,非常不满意
  5. 吃自己的狗食,用自己的产品——再谈华为芯片
  6. opencv出错:error: (-213:The function/feature is not implemented) Unknown/unsupported array type
  7. UBUNTU设置环境变量MALLOC_CHECK_=1检查内存
  8. 脚本中调用别的脚本,如何得到执行结果?
  9. 汝把公司搞死了,不批汝批谁?
  10. C# dataGridView控件 控件中至少有一列没有模板问题【解决】 添加新列