元素大小

偏移量

offsetHeight: 元素在垂直方向上占用的空间大小,包括元素的高度,水平滚动条的高度,上边框高度和下边框高度。

offsetWidth: 元素在水平方向上占用的空间大小,包括元素的宽度度,垂直滚动条的高度,左边框高度和右边框高度。

offsetLeft: 元素的左外边框至包含元素的左内边框之间的像素距离。

offsetRight: 元素的左外边框至包含元素的左内边框之间的像素距离。

offsetTop: 

offsetParent: 属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的容器元素。

如果这个容器元素未进行CSS定位, 则offsetParent属性的取值为根元素

客户区大小

元素内容及其内边距占据的空间大小。

clientWidth

clientHeight

滚动大小

包含滚动内容的元素大小。

scrollHeight: 再没有滚动的情况下,元素内容的总高度。

scrollWidth: 在没有滚动的情况下,元素内容的总宽度。

scollLeft: 被隐藏再内容区域左侧的像素。通过设置这个属性可以改变元素的滚动位置。

scollTop: 隐藏再内容区域上方的像素。通过设置这个属性可以改变元素的滚动位置。

确定元素大小

getBoundingClientRect():  为每个元素返回一个矩形对象,包含4个属性: left, top, right bottom。这些属性给出了元素再页面中相对视口的位置。

function getElementLeft(element) {//获取形参的元素的左外边框指包含元素的左内边框之间的像素差var actualLeft = element.offsetLeft; //获取包含块的内边距var current = element.offsetParent;//当包含块不是空的时候while(current !== null) {//左偏移量 + 包含框的做偏移量 并赋值actualLeft += current.offsetLeft;//获取包含块的父级current = current.offsetParent;} 把值返回出去return actualLeft;
}function getElementTop(element) {var actualTop = element.offsetTop;var current = element.offsetParent;while(current !== null) {actualTop += current.offsetTop;current = current.offsetParent;}return actualTop;}function getBoundingClientRect(element) {//获取形参的顶部滚动距离var scrollTop = document.documentElement.scrollTop;//获取形参的左边滚动距离var scrollLeft = document.documentElement.scrollLeft;//如果形参的getBoundingClientRect可以用的话if(element.getBoundingClientRect) {//检测这个函数的形参的自定义属性offset不是数字的时候if(typeof arguments.callee.offset != "number") {//创建一个divvar temp = document.createElement("div");//给这个div绝对定位 temp.style.cssText = "position: absolute; left: 0; top: 0;";//把这个元素丢进文档树
           document.body.appendChild(temp);//用getboundingClientRect方法获取这个div的高度,-减去滚动的距离,的到这个元素的top值。arguments.callee.offset =-temp.getBoundingClientRect().top - scrollTop;//从文档树中删除这个div
           document.body.removeChild(temp);//解除引用temp = null;}//获取这个形参的bottom.top,left,和rightvar rect = element.getBoundingClientRect();// 把这个对象的自定义属性赋给它自己var offset = arguments.callee.offset;//把值返回出去return {left: rect.left + offset,right: rect.right + offset,top: rect.top + offset,bottom: rect.bottom + offset}} else {var actualLeft = getElementLeft(element);var actualTop = getEementTop(element);return {left: actualLeft - scrollLeft,right: actualLeft + element.offsetWidth - scrollLeft,top: actualTop - scrollTop,bottom: actualTop + elementoffsetHeifht - scrollTop}
} 

遍历

DOM遍历是深度优先的DOM结构遍历,移动的方向至少有俩个,遍历以给定节点为根,不可能超出DOM树的根节点。

任何节点都可以作为遍历的根节点。即可以向下遍历,或者向上遍历。

NodeIterator:   

document.createNodeIterator()//创建新实例

接受4个参数.

root:作为搜索起点的树中的节点。

whatToShow: 表示要访问那些节点的数字代码。

filter:NodeFilter对象。一个表示应该接受还是拒绝某种特定节点的函数。

每个NodeFilter对象只有一个方法,即accept-Node();如果应该访问给定节点返回NodeFilter.FILTER_ACCEPT,不应该访问返回NodeFilter.FILTER_SKIP;

NodeFilter的俩个主要方法:

nextNode() 下一个节点, previousNode(),上一个节点。

例如一个展示《p》元素的节点迭代器

var filter = {acceptNode: function(node) {// 如果形参的标签名等于p 就返回 NodeFilter.FILTER_ACCEPT,
        // 不然返回NodeFilter.FILTER.SKIP;return node.tagName.toLowerCase() == "p" ?NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER.SKIP;}
};var iterator = document.createNodeIterator(root, Nodefilter.SHOW_ELEMENT, filter, false);

遍历div元素中的所有元素

var oDiv = document.getElementById("div1");
var iterator = document.createNodeIterator(oDiv, NodeFilter.SHOW_ELEMENT, null, false);var node = iterator.nextNode();
while(node !== null) {console.log(node.tagName);node = iterator.nextNode();}
// DIV
// P
// B
// UL
// LI(3)

如果只想返回遍历中遇到的li元素,只要使用一个过滤器

var oDiv = document.getElementById("div1");
var filter = function(node) {return node.tagName.toLowerCase() == "li" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;   // NodeFilter.FILTER_ACCEPT 和 NodeFilter.FILTER_SKIP都是跳过指定的节点
}
var iterator = document.createNodeIterator(oDiv, NodeFilter.SHOW_ELEMENT, filter, false);var node = iterator.nextNode();
while(node !== null) {console.log(node.tagName);node = iterator.nextNode();
}
//li(3)

TreeWalker

TreeWalker是NodeIterator的高级版本,提供了不同方向上的遍历DOM结构的方法

parentNode():遍历到当前节点的父节点;

firstChild(): 遍历到当前节点的第一个子节点。

lastChild(): 遍历到当前节点的最后一个子节点。

nextSiblings(): 遍历到当前节点的下一个同辈节点节点。

previousSiblings(): 遍历到当前节点的上一个同辈节点。

TreeWalker和NodeIterator一样接受4个参数, 作为遍历起点的根节点、要显示的节点类型、过滤器。一个表示是否扩展 实例引用的布尔值。

var oDiv = document.getElementById("div1");
var walker = document.createTreeWalker(oDiv,NodeFilter.SHOW_ELEMENT, filter, false);var filter = function (node) {return node.tagName.toLowerCase() == "li" ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;//  使用walker时NodeFilter.FILTER_REJECT跳过相应节点及该整个字树
 }var node = walker.nextNode();
if( node !== null) {console.log(node.tagName);node = walker.nextNode();
}
// LI

使用TreeWalker遍历DOM树,即使不定义过滤器,也可以取得所有<li>元素。

var oDiv = document.getElementById("div1");
var walker = document.createTreeWalker(oDiv, NodeFilter.SHOW_ELEMENT, null, false);walker.firstChild();          //div的第一个子元素即,定位到<p>元素
walker.nextSibling();     //p元素下一个同辈元素,即定位到<ul>元素var node = walker.firstChild(); //  转到uil的第一个子元素
while(node !== null) {           .//  当 node不为空的时候,console.log(node.tagName);  //   弹出标签名node = walker.nextSibling(); //  保存walk的下一个同辈元素
}

范围

为了方便控制页面,"DOM二级遍历和范围" 定义了“范围”接口。通过范围可以选择文档中的一个区域,而不比考虑节点的界限。

var range = document.createRange();

新创建的范围直接与创建它的文档关联,不能用于其他文档。创建范围之后,接下来就可以使用它再后台选择文档中的特定部分。设置位置之后,可以针对范围的内容进入很多操作。

每个范围由一个range类型的实例表示

startContainer: 包含范围起点的节点(选取中第一个节点的父节点)。

startOffset: 范围在startContainer中的偏移量。

endContainer: 包含范围终点的节点。

endOffset: 包含范围在endContainer终点的偏移量=。

commonAncestorContainer: startContainer和endContaine共同祖先节点再文档树中位置最深的那个。

1用DOM范围实现简单选择

用范围选择文档中的一部分。

有俩种方法 selectNode() 或 selectNodeContents()。都接受一个参数,即DOM节点,然后使用这个DOM节点信息来填充范围。

selectNode()选择整个节点,包括子节点。selectNodeContents()只选择节点的子节点。

<body><p id="p1"><b>Hello</b> world!</p>
</body>

可以使用下列的代码创建范围:

var range1 = document.createRange();
var range2 = document.createRange();p1 = document.getElementById("p1");range1.selectNode(p1);range2.selectNodeContents(p1);

2、用DOM范围实现复杂选择

使用setStart() ,setEnd()可以实现更复杂的范围选择接受一个参照节点和一个偏移量。

setStart(): 参照节点变成startContainer,偏移量变成startOffset。

setEnd():  参照节点endContainer, 偏移节点endOffset。

<body><p id="p1"><b>Hello</b> world!</p>
</body>

var p2 = document.getElementById("p1");
helloNode = p1.firstChild.firstChild;
worldNode = p1.lastChild;var range3 = document.createRange();
//传入helloNode,并设置偏移量2 (也就是e的位置)
range3.setStart(helloNode, 2);
////传入helloNode,并设置偏移量3  (也就是r的位置)
range3.setEnd(worldNode, 3)

3 操作DOM范围中的内容

在创建范围时,内部会为这个范围创建一个文档片段,范围所属的全部节点都被添加到这个文档片段中。

deleteContents(): 可以从文档中删除范围所包含的内容。

extractContents(): 也可以从文档中移除范围内容,但是会返回文档片段。

var text = document.getElementById("p2");
var _this = text.firstChild.firstChild;
var _is = text.lastChild;var range = document.createRange();
range.setStart(_this, 2);
range.setEnd(_is, 3);var fragment = range.extractContents();
text.parentNode.appendChild(fragment);

4、插入DOM范围中的内容

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

<body><span style="color: red">Inserted text</span>
</body>

var p1 = document.getElementById("p2");
var hNode = p1.firstChild.firstChild;
var wNode = p1.firstChild;var range = document.createRange();
range.setStart(hNode, 2);
range.setEnd(wNode, 3);
var eSpan = document.createElement("span");
eSpan.style.color = "red";
eSpan.appendChild(document.createNodeText("Inserted text"));
range.insertNode(eSpan);

startContainer

转载于:https://www.cnblogs.com/zhangbaihua/p/5604555.html

第十二章 DOM2和DOM3相关推荐

  1. Js高级程序设计第三版学习(十二章)

                                  Js高级程序设计第三版学习(十二章) 第十二章 DOM2和DOM3   1.样式: 访问样式属性 任何支持style特性的HTML元素都有一 ...

  2. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第二十二章 待机唤醒实 ...

  3. 构建之法第十,十一,十二章阅读

    第十章经典用户和场景 虽说经典场景和经典用户很有必要去研究去效仿,但是随着时间发展,新的用户新的需求不断涌现,那该怎么平衡? 第十一章软件设计与实现 软件设计过程中,如何管理设计变更呢? 第十二章用户 ...

  4. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  5. stm32 文件系统dma大小_「正点原子NANO STM32F103开发板资料连载」第二十二章 DMA 实验...

    1)实验平台:[正点原子] NANO STM32F103 开发板 2)摘自<正点原子STM32 F1 开发指南(NANO 板-HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 ...

  6. 系统架构师学习笔记_第十二章_连载

    第十二章  系统安全架构设计 12.1  信息系统安全架构的简单描述 信息安全的特征 是为了保证信息的 机密性.完整性.可用性.可控性.不可抵赖性. 以风险策略为基础. 12.1.1  信息安全的现状 ...

  7. 《c++ templates》学习笔记(9)——第十二章 特化与重载

    1       第十二章 特化与重载 1.1    重载函数模板 和一般的函数重载类似,函数模板也可以进行重载,比如下面的两个f,这是两个同名函数,1和2并没有关系,2不是1的局部特化.2是1的一个重 ...

  8. 开发日记-20190915 关键词 汇编语言王爽版 第十二章

    第十二章 内中断 任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部传送过来或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理.这种特 ...

  9. 【译】 WebSocket 协议第十二章——使用其他规范中的WebSocket协议

    概述 本文为 WebSocket 协议的第十二章,本文翻译的主要内容为如何使用其他规范中的 WebSocket 协议. 使用其他规范中的WebSocket协议(协议正文) WebSocket协议旨在由 ...

最新文章

  1. 赛灵思PLL重配置一PLL配置介绍___S6器件族
  2. SqlServer 2008 R2定时备份数据库,并且发送邮件通知
  3. 以太坊系列之十一: 零起步使用remix开发智能合约
  4. jQuery高度及位置操作
  5. Linux系统的基本法则
  6. linux管理防火墙开放端口
  7. sql 自定义函数 示例_SQL滞后函数概述和示例
  8. QApplication、QGuiApplication和QCoreApplication三者的区别与联系
  9. 无法显示此网页 php模拟,新手进行php的模拟登录 按照网页的代码进行输入无法显示结果...
  10. lua劈分字符串方法及实例
  11. Ubuntu 安装mujoco
  12. c++三大函数:拷贝构造(copy ctor)、拷贝赋值(copy op)、析构函数(dtor)
  13. 如何计算两个日期之间的工作天数
  14. 自考行政管理题库(含答案)
  15. 微信支付V3-下载交易账单
  16. 瑞华吉瑞保重大疾病保险怎么样?好不好
  17. Pytorch高效降低内存 torch.utils.checkpoint()的使用
  18. ppt转换pdf格式软件
  19. 【点云3D目标检测】IA-SSD报错:Expected isFloatingType(grads[i].scalar_type()) to be true, but got false.
  20. 高效必备!这4个黑科技小网站,让你眼前一亮

热门文章

  1. jinja Extends Blocks Include
  2. oracle使用连接池,使用Oracle的数据连接池
  3. python特征数据类型及常用操作对比_更高效的利用Jupyter+pandas进行数据分析,6种常用数据格式效率对比!...
  4. linux下pip安装模块失败,Linux pip包安装错误
  5. debian9.4网络配置及永久静态默认路由
  6. 2020年海南大学计算机调剂,2020年海南大学招收调剂生
  7. php 返回索引,PHP mySQL - 你能否返回帶有數字索引的關聯數組?
  8. VMware ESXi/ESX 的内部版本号和版本 (2143832)-2020-10-27更新
  9. H3C-IMC 自动发现功能如何使用
  10. Linux学习总结(74)——wget 命令详解