用DOM范围实现简单选择

selectNode()和selectNodeContents()它们都接收一个DOM节点参数,然后使用该节点中的信息来填充范围,其中selectNode()方法选择整个节点,包括其子节点;而selectNodeContents()方法只选择节点的子节点

var range1=document.createRange();

var range2=document.createRange();

  p1=document.getElementById("p1");

range1.selectNode(p1);  //包含id为“p1”的整个节点

range2.selectNodeContents(p1);  //只包含id为“p1”的子节点

在调用selectNode()时,startContainer、endContainer和commonAncestorContainer都等于传入节点的父节点,而startOffset属性等于给定节点在其父节点的childNodes集合中的索引,endOffset等于startOffset加上选择了多少个节点

在调用selectNodeContents()时,startContainer、endContainer和commonAncestorContainer都等于传入的节点,而startOffset属性始终等于0(第一个子节点开始),endOffset等于子节点数量

更精细的控制

setStartBefore(refNode):将范围的起点设置在refNode之前,refNode就是范围选区的第一个子节点,同时会将startContainer设置为refNode.parentNode

setStartAfter(refNode):将范围的起点设置在refNode之后,refNode的后一个同胞元素就是范围选区的第一个子节点

setEndBefore(refNode):将范围的终点设置在refNode之前,上一个同胞元素是范围选区中最后一个子节点

setEndAfter(refNode):将范围的终点设置在refNode之后,refNode是范围选区中最后一个子节点

用DOM范围实现复杂选择

setStrat()和setEnd()方法,两个方法都接收两个参数,一个参照节点和一个偏移量值,对于setStart()来说,参照节点会变成startContainer,偏移量值会变成startOffset;对于setEnd()来说,参照节点会变成endContainer,偏移量值会变成endOffset

操作DOM范围中的内容

在创建范围时,内部会为这个范围创建一个文档片段,范围所属的全部节点都被添加到这个文档片段中,对于残缺的标签,范围会自动为其补全(注意:表示范围的内部文档片段中的所有节点,都只是指向文档中相应节点的指针)

第一个方法:deleteContents(),能够从文档中删除范围所包含的内容;

extractContents()也会从文档中移除范围选区,有一点不同的是它会返回被移除的文档片段,以便插入到文档中其他地方(注意,在使用appendChild()方法时,添加到文档中只是片段的子节点,非片段本身)

cloneContents(),创建范围对象的一个副本,再其他地方插入该副本

插入DOM范围中的内容

insertNode()可以向范围选区开始处插入一个节点

range.insertNode(span);  //插入节点

surroundContents()方法,环绕范围插入内容,接收一个环绕范围内容的节点,后台会执行3步:

提取出范围中的内容(类似extractContent());

将给定节点插入到文档中原来范围所在的位置上;

将文档片段的内容添加到给定节点中。

  ...

var span=document.createElement("span");

span.style.backgroundColor="yellow";

range=surroundContents(span);

以上代码给范围选区添加黄色背景

折叠DOM范围

collapse()方法,接收一个布尔值参数,表示折叠到范围的哪一端,true表示折叠到范围的起点,false则为终点,collapsed属性确定范围是否折叠完毕

range.collapse(true);  //折叠到起点

alert(range.collapsed);  //输出true

检测某个范围是否处于折叠状态,可以帮助我们确定范围中两个节点是否紧密相邻

JavaScript高级程序设计37.pdf的更多相关文章

  1. JavaScript高级程序设计61.pdf

    JSON对象 早期的JSON解析器就是使用JavaScript的eval()函数,ECMAScript5对解析JSON的行为做出了规定,定义了全局对象JSON. JSON对象有2个方法:stringi ...

  2. JavaScript高级程序设计60.pdf

    错误处理 try-catch语句 try{ //可能会导致错误的代码 }catch(error){ //在错误发生时如何处理 } error是一个包含着错误信息的对象,它有一个message属性,保存 ...

  3. JavaScript高级程序设计58.pdf

    15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域 ...

  4. JavaScript高级程序设计57.pdf

    表单序列化 首先了解一下浏览器如何将数据发送给服务器 对表单字段的名称和值进行URL编码,使用和号(&)分隔 不发送禁用的表单字段 只发送勾选的复选框和单选按钮 不发送type为“reset” ...

  5. JavaScript高级程序设计55.pdf

    输入模式 HTML5为文本字段新增了pattern属性,这个属性的值是一个正则表达式,用于匹配文本框中的值 例如,只想在允许在文本字段中输入数值 <input type="text&q ...

  6. JavaScript高级程序设计54.pdf

    过滤输入 对于一些浏览器,可以使用正则表达式里的text()测试用户按下的按键,Firefox和safari(3.1版本之前)会对向上向下.退格键和删除键触发keypress事件,在Firefox中, ...

  7. JavaScript高级程序设计53.pdf

    共有的表单字段方法 每个表单字段都有两个方法:focus()和blur(),其中focus()用于将浏览器焦点设置到表单字段,激活表单字段.可以侦听页面的load事件 EventUtil.addHan ...

  8. JavaScript高级程序设计52.pdf

    表单脚本 表单的基础知识 在HTML中,表单是由<form>元素表示的,在Javascript对应的是HTMLFormElement类型,它继承自HTMLElement,因此具有与其他HT ...

  9. JavaScript高级程序设计50.pdf

    hashchange事件 HTML5新增了hashchange事件,以便在URL的参数列表(及URL中“#”号后面的所有字符串)发生变化时通知开发人员,之所以新增这个事件,是因为在Ajax应用中,开发 ...

随机推荐

  1. 浅析JAVA设计模式(二)

    2. 里氏替换原则:LSP(Liskov Substitution Principle)里氏替换原则,定义为只要父类出现的地方子类就可以出现,而且用子类替换后,程序也不会出现问题,使用者根本不用关心是 ...

  2. Android MVP模式

    转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...

  3. Null Pointer --设计模式

    在Joshua Bloch很有名的一本书<Effective in java>中建议不要在代码中返回空的collection/map/array,就像下面的代码一样: public Lis ...

  4. 《JavaScript高级程序设计》笔记(1):<script>元素

    使用<script>元素内部的JavaScript代码将从上至下依此解释.在使用<script>嵌入的JavasCript代码时,代码任何地方不能出现"</sc ...

  5. phpcms(1)phpcms V9 MVC模式 与 URL访问解析(转)

    [1]URL访问解析 观察访问网页时的网址,可以得出模块访问方法,如下示例: http://www.abcd.com.cn/phpcms/index.php?m=content&c=index ...

  6. OS概论2

    实时系统 实时即表示及时,实时计算可以定义为这样一类计算:系统的正确性,不仅由计算的逻辑结果来确定,而且还取决于产生结果的时间.事实上,实时系统最主要的特征,是将时间作为关键参数,它必须对所接收到的某 ...

  7. 用powerdesigner建模工具生成数据库

    1,使用powerdesignerP:主键 F:外键 M:是否可为空 2,两张表建立主外键关系时,主外键名称要相同.比如A表 A_id name  说明id(P) B表 B_id name  说明id ...

  8. unidac连接FireBird数据库

    dbconn: TUniConnection; with dbconn do    begin      if not Connected then         begin            ...

  9. uva 1482 - Playing With Stones

    对于组合游戏的题: 首先把问题建模成NIM等经典的组合游戏模型: 然后打表找出,或者推出SG函数值: 最后再利用SG定理判断是否必胜必败状态: #include<cstdio> #defi ...

  10. uva 12124 - Assemble

    最大值最小的题: 直接用二分,比较简单: 不过我的二分老是不用好.有时间总结一下! #include<cstdio> #include<map> #include<vec ...