这篇文章给大家聊聊关于高效JavaScript DOM操作技巧详解,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
image.png清晰图片:http://naotu.baidu.com/file/1c247240a397f00ebebf5ffd09ff864f?token=c2173932b6070264
nodeType属性
每个节点都有一个nodeType属性,用于指示节点的类型。
Node 类型定义了12 种节点类型。
Node.ELEMENT_NODE;//1Node.ATTRIBUTE_NODE;//2Node.TEXT_NODE;//3Node.CDATA_SECTION_NODE;//4Node.ENTITY_REFEREN_NODE;//5Node.ENTITY_NODE;//6Node.PROCESSING_INSTRUCTION_NODE;//7Node.COMMENT_NODE;//8Node. DOCUMENT_NODE;//9Node.DOCUMENT_TYPE_NODE;//10Node.DOCUMENT_FRAGMENT_NODE;//11Node.NOTATION_NODE;//12
通过将节点的nodeType 与这些常量进行比较,可以轻松确定节点的类型。 if(someNode.nodeType==Node.ELEMENT_NODE){
alert("节点是一个元素");
为了保证跨浏览器兼容性,最好将nodeType属性与属性值进行比较:
if(someNode.nodeType==1){
alert("节点是一个元素");
}
nodeName和nodeValue属性:
这两个属性的值完全取决于节点的类型,因此在使用这两个值之前最好检查节点的类型:
if(someNode.nodeType==1){
值=someNode.nodeName; //nodeName的值为元素的标签名
}元素节点的nodeName与标签名相同,nodeValue未定义或为null。属性节点的NodeName与属性名称相同,nodeValue为属性值。文本节点的nodeName始终是#text,nodeValue是文本本身。文档节点的nodeName始终为#document,nodeValue为null。评论节点的nodeName是#comment,nodeValue是评论的内容。
节点关系
childNodes
每个节点都有一个childNodes属性,该属性存储一个NodeList对象。
NodeList 是一个类似数组的对象,它保存可以按位置访问的有序节点集。
尽管可以通过方括号语法访问NodeList 的值,并且该对象也具有length 属性,但它不是Array 类型的实例。
NodeList对象的独特之处在于它实际上是基于DOM结构动态查询的结果,因此DOM结构的变化可以自动反映在NodeList中。
以下示例演示如何访问存储在NodeList 中的节点:通过方括号或使用item() 方法。
var firstChild=someNode.childNodes[0];
var SecondChild=someNode.childNodes.item(1);
var count=someNode.childNodes.length;
length 属性表示访问时NodeList 中包含的节点数。正如之前介绍的,对arguments对象使用Array.prototype.slice()方法可以将其转换为数组。我们还可以对NodeList 对象使用相同的方法将其转换为数组:
var ArrayNodes=Array.prototype.slice.call(someNode.childNodes,0);
parentDode
每个节点都有一个parentNode属性,它指向文档树中的父节点。
childNodes 列表中包含的所有节点都有相同的父节点,因此它们的parentDode 属性都指向同一个节点。
previousSibling NextSibling
childNodes 列表中包含的每个节点都是彼此的兄弟节点。通过使用每个节点的previousSibling 和nextSibling 属性,可以访问同一列表中的其他节点。
列表中第一个节点的previousSibling 属性为null。列表中最后一个节点的nextSibling 属性也为null。如果列表中只有一个节点,则该节点的previousSibling 和nextSibling 属性均为null。
firstChild lastChild
父节点的firstChild 属性指向其childNodes 列表中的第一个节点。该值始终等于childNodes[0]。父节点的lastChild属性指向其childNodes列表中的最后一个节点。该值始终等于childNodes[childNodes.length-1]。当只有一个子节点的情况下,firstChild和lastChild指向同一个节点。如果没有子节点,则firstChild和lastChild都为null。
hasChildNodes
如果节点包含一个或多个子节点,则此方法返回true。
比查询childNodes 列表的length 属性更容易。
ownerDocument
所有节点都有这个属性,它指向的文档节点指向整个文档。
这种关系意味着任何节点都属于它所在的文档,并且任何节点都不能同时存在于两个或多个文档中。
通过这个属性,我们可以直接访问文档节点,而不必回溯节点层次结构中的各层到达顶部。
操作节点
appendChild()
用于将节点添加到childNodes 列表的末尾。添加节点后,新节点、父节点以及childNodes的上一个最后一个子节点的关系指针都会相应更新。更新完成后,appendChild()返回新添加的节点var returnedNode=someNode.appendChild(newNode);
警报(返回节点==新节点); //真的
警报(someNode.lastChild==returnedNode); //true 如果传入appendChild的节点已经是文档的一部分,结果是将节点从原来的位置移动到新位置。
尽管DOM 树可以被视为一系列连接的指针,但任何DOM 节点不能同时出现在文档中的多个位置。
因此,如果调用appendChild()时传入父节点的第一个子节点,那么该节点将成为父节点的最后一个子节点。
var returnedNode=someNode.appendChild(someNode.firstChild);
警报(someNode.firstChild==returnedNode); //错误的
警报(someNode.lastChild==returnedNode); //true
inserBefore()
如果需要将节点放置在childNodes列表中的特定位置而不是末尾,可以使用insertBefore方法。该方法接受两个参数:要插入的节点和要用作引用的节点。
插入节点后,插入的节点将成为引用节点的前一个兄弟节点,同时被该方法返回。
如果引用节点为空,insertBefore()执行与appendChild()相同的操作。
//插入后成为最后一个子节点
returnedNode=someNode.insertBefore(newNode,null);
警报(someNode.lastChild==returnedNode); //真的
//插入后成为第一个子节点
returnedNode=someNode.insertBefore(newNode,someNode.firstNode);
警报(新节点==返回节点); //真的
警报(someNode.firstChild==returnedNode); //真的
//插入到最后一个子节点之前
returnedNode=someNode.insertBefore(newNode,someNode.lastNode);
Alert(returnedNode==someNode.childNodes[someNode.childNodes.length-2]); //trueappendChild()和insertBefore()都只会插入节点,不会删除节点。
replaceChild()
该方法接收两个参数,要插入的节点和要替换的节点。
此方法返回要替换的节点,并将其从文档树中删除,并用要插入的节点代替它。
//替换第一个子节点
var returnedNode=someNode.replaceChild(newNode,someNode.firstChild);
//替换最后一个子节点
var returnedNode=someNode.replaceChild(newNode,someNode.lastChild);当使用replaceChild插入节点时,该节点的所有关系指针都会从它替换的节点中复制过来。
尽管从技术上讲,被替换的节点仍在文档中,但它在文档中不再拥有自己的位置。
removeChild()
如果只想删除节点而不插入节点,可以使用removeChild()方法。该方法接收一个参数,即要删除的节点。被移除的节点将成为该方法的返回值。
//删除第一个子节点
var returnedNode=someNode.removeChild(someNode.firstChild);
//删除最后一个子节点
【高效JavaScript DOM操作技巧详解】相关文章:
用户评论
最近在学前端,学习JSTDOM操作真是太重要了!
有14位网友表示赞同!
想要把网页弄得更有互动性?JS DOM 操作就是关键所在哦。
有6位网友表示赞同!
学习完JSTDOM的操作,感觉自己离做一个优秀的程序员迈进了一大步!
有19位网友表示赞同!
有时候浏览器的界面不太符合我的喜好,希望能通过 JSTDOM 操作来修改呢。
有17位网友表示赞同!
JSTDOM 的操作方法好像很多很复杂,还得好好研究一下才行。
有18位网友表示赞同!
我觉得学习 JSTDOM操作最难的还是那些高级特性,太绕了!
有15位网友表示赞同!
有了 JSTDOM的操作,我可以轻松实现网页元素的动态更新,很棒!
有14位网友表示赞同!
JSTDOM 操作真的能让人在前端开发中得心应手啊。
有8位网友表示赞同!
有没有什么好的资源推荐,希望能让我更快速地掌握 JSTDOM操作?
有11位网友表示赞同!
学习 JSTDOM操作感觉就像是在构建一座虚拟现实,太 cool 了!
有13位网友表示赞同!
我想要做个交互式的网页,不知道该怎么用 JSTDOM 操作来实现呢。
有7位网友表示赞同!
JSTDOM操作真是前端开发必备的技能啊!
有11位网友表示赞同!
希望以后能运用 JSTDOM操作 来打造更酷炫的网站体验!
有10位网友表示赞同!
我觉得 JSTDOM 操作很有潜力,会应用越来越广泛!
有13位网友表示赞同!
学习 JSTDOM 操作真的很过瘾,可以掌控网页元素的一切!
有20位网友表示赞同!
有了 JSTDOM 操作,我就能实现网页上的各种特效和动画了
有13位网友表示赞同!
JSTDOM操作真是太强大,能做的事情太多太多了!
有13位网友表示赞同!
感觉学习 JSTDOM的操作就像玩游戏一样,乐趣十足!
有17位网友表示赞同!