博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript标准DOM Range操作
阅读量:7071 次
发布时间:2019-06-28

本文共 2934 字,大约阅读时间需要 9 分钟。

简介

Range是一种fragment(HTML片断),它包含了节点或文本节点的一部分。 可以通过document.createRange()或象的getRangeAt()方法获得。

createRange()是在2级DOM里定义的一个方法,它属于document对象。IE是不支持此方法的,因此需要检测浏览器的支持性。

if (document.implementation && document.implementation.hasFeature && document.implementation.hasFeature("Range", "2.0")) {    var oRange = document.createRange();    // 支持} else {    // 不支持}

属性

当创建一个Range对象后,该对象就有了以下属性,以下属性全为“只读”。

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

spanHello World

spanHello World

endOffset
“起点”在endContainer中的偏移量,其它细节同startOffset。
commonAncestorContainer
第一个包含Range的节点,同时包含起点和结束点。
collapsed
起点和结束点在一起时为true;Range对象为空(刚createRange()时)也为true。

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

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

Hello World

此时选中的fragment不是well-formed,浏览器会自动添加一些元素,最终形成下面的fragment。

Hello World

注意well-formed这一步骤是隐藏的,也就是说利用CSS中“b + b {}”是选不到第二个b元素的。
setStartBefore(referenceNode)、setStartAfter(referenceNode)
setEndBefore(referenceNode)、setEndAfter(referenceNode)
setStartBefore:将“起点”设置到referenceNode前
setStartAfter:将“起点”设置到referenceNode后
setEndBefore:将“结束点”设置到referenceNode前
setEndAfter:将“结束点”设置到referenceNode后
注意:使用这四个方法设置的“起点”或“结束点”的父节点与referenceNode的父节点是同一个元素。
selectNode(referenceNode)和selectNodeContents(referenceNode)
selectNode:设置Range的范围,包括referenceNode和它的所有后代(子孙)节点。
selectNodeContents:设置Range的范围,包括它的所有后代节点。
二者的区别:
o_range_selectNode.PNG
o_range_selectNodeContents.PNG
collapse(toStart)
折叠该范围,使它的“起点”和“结束点”重合。
参数toStart,true时折叠到Range边界的首部,为false时折叠到Range尾部,默认为false。

修改范围的方法

cloneContents()
可以克隆选中Range的fragment并返回改fragment。这个方法类似于extractContents(),但是不是删除,而是克隆。
deleteContents()
从Dom中删除Range选中的fragment。注意该函数没有返回值(实际上为undefined)。
extractContents()
将选中的Range从DOM树中移到一个fragment中,并返回此fragment。

Hello World

运行后HTML结构,体现了前面提到的well-formed原则。
  

Herld

llo Wo
insertNode
方法可以插入一个节点到Range中,注意会插入到Range的“起点”。

Hello World

运行后HTML结构:
        

HeInserted textllo World

surroundContents()

Hello World

因为部分地选择了“<b>oHello</b>”,所以会抛出“BAD_BOUNDARYPOINTS_ERR”错误(虽然会自动添加“<b>”让元素“well-formed”,仍然会报错)。下面的代码将能够正常运行:

Hello World

运行后,HTML将变成

Hello World

其它的方法

cloneRange()
var oNewRange = oRange.cloneRange();
cloneRange()方法将返回一个当前Range的副本,它也是Range对象。
注意它和cloneContents()的区别在于返回值不同,一个是HTML片段,一个是Range对象
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()
返回该范围表示的文档区域的纯文本内容,不包含任何标签。

参考链接

转载地址:http://vnhll.baihongyu.com/

你可能感兴趣的文章
四、分离分层的 platform驱动
查看>>
FutureTask详解
查看>>
2018年9月
查看>>
ES6新特性概览
查看>>
Ext.data.Store添加动态参数
查看>>
QtCreator Local and Expression 界面为空(转)
查看>>
23种设计模式
查看>>
c# 线程的基本使用
查看>>
Java基础教程(2)--Java开发环境
查看>>
有点激动,WPF换肤搞定了!
查看>>
矩阵赋值实例(matrixAssign)
查看>>
iOS多线程编程之NSThread的使用
查看>>
【深蓝】Volley 全程模拟
查看>>
C#获取 URL参数
查看>>
python函数篇0-1
查看>>
FZU 2187 回家种地 ( 扫描线 + 离散 求矩阵单次覆盖面积 )
查看>>
数据库面试题汇总
查看>>
Union Find算法总结
查看>>
JavaScript 无刷新修改浏览器URL地址栏
查看>>
美化版复选框
查看>>