js基础学习第二天(关于DOM和BOM)二

来源:互联网 发布:编辑gif的软件 编辑:程序博客网 时间:2024/06/02 18:20

DOM的节点

节点主要有以下几个属性和

nodeNameString节点的名字;根据节点的类型而定义,元素节点返回tagName,文本节点返回#text,属性节点返回属性名nodeValueString节点的值;根据节点的类型而定义.元素节点此属性为空,文本节点些属性即为节点中的字符串,属性节点返回属性值nodeTypeNumber节点的类型常量值之一ownerDocumentDocument指向这个节点所属的文档firstChildNode指向在childNodes列表中的第一个节点lastChildNode指向在childNodes列表中的最后一个节点childNodesNodeList所有子节点的列表previousSiblingNode指向前一个兄弟节点;如果这个节点就是第一个兄弟节点,那么该值为nullnextSiblingNode指向后一个兄弟节点;如果这个节点就是最后一个兄弟节点,那么该值为nullhasChildNodes()Boolean当childNodes包含一个或多个节点时,返回真attributesNamedNodeMap包含了代表一个元素的特性的Attr对象;仅用于Element节点appendChild(node)Node将node添加到childNodes的末尾removeChild(node)Node从childNodes中删除nodereplaceChild (newnode,oldnode)Node将childNodes中的oldnode替换成newnodeinsertBefore (newnode,refnode)Node在childNodes中的refnode之前插入newnod

除节点外,DOM还定义了一些助手对象,它们可以和节点一起使用,但不是DOM文档必有的部分。

  • NodeList——节点数组,按照数值进行索引;用来表示一个元素的子节点。比如childNodes。NodeList有个length属性表示节点数量
  • NamedNodeMap——同时用数值和名字进行索引的节点表;用于表示元素特性。比如元素的attributes。NamedNodeMap对象也有一个length属性来指示它所包含的节点的数量。

这些助手对象为处理DOM文档提供附加的访问和遍历方法。


需要注意的是 在ff上 每个标签之间的空白也算节点。而ie上不是。

关于节点类型 有以下

  • Node.ELEMENT_NODE (1)
  • Node.ATTRIBUTE_NODE (2)
  • Node.TEXT_NODE (3)
  • Node.CDATA_SECTION_NODE (4)
  • Node.ENTITY_REFERENCE_NODE (5)
  • Node.ENTITY_NODE (6)
  • Node.PROCESSING_INSTRUCTION_NODE (7)
  • Node.COMMENT_NODE (8)
  • Node.DOCUMENT_NODE (9)
  • Node.DOCUMENT_TYPE_NODE (10)
  • Node.DOCUMENT_FRAGMENT_NODE (11)
  • Node.NOTATION_NODE (12)

节点类型常量都是Node对象的属性,但是IE不支持Node对象,但是仍可以使用数值

属性节点

即便Node接口已具有attributes方法,且已被所有类型的节点继承,然而,只有Element节点才能有特性。Element节点的attributes属性其实是NamedNodeMap,它提供一些用于访问和处理其内容的方法:

  • getNamedItem(name)——返回nodeName属性值等于name的节点;
  • removeNamedItem(name)——删除nodeName属性值等于name的节点;
  • setNamedItem(node)——将node添加到列表中,按其nodeName属性进行索引;
  • item(pos)——像NodeList一样,返回在位置pos的节点;
请记住这些方法都是返回一个Attr节点,而非特性值。

当NamedNodeMap用于表示特性时,其中每个节点都是Attr节点,它的nodeName属性被设置为特性名称,而nodeValue属性被设置为特性的值。示例:

<p id="p1" style="background-color:red;" title="P!!!">Some Text!</p>var p1 = document.getElementById("p1");//访问ID属性alert(p1.attributes.getNamedItem("id")).nodeValue;//也可以用数值来访问ID属性alert(p1.attributes.item(0)).nodeValue;//也可以改变它的值p1.attributes.getNamedItem("id").nodeValue = "newP1";

Attr节点也有一个完全等同于(同时也完全同步于)nodeValue属性的value属性,并且有name属性和nodeName属性保持同步。我们可以随意使用这些属性来修改或变更特性。但这些方法都比较复杂,所以DOM又定义了三个元素方法来帮助访问特性:

  • getAttribute(name)——等于attributes.getNamedItem(name).value
  • setAttribute(name, newValue)——等于attribute.getNamedItem(name).value = newValue
  • removeAttribute(name)——等于attributes.removeNamedItem(name)

NodeList

事实上我们早接触过NodeList了

var allTags = document.getElementsByTagName("*");alert(allTags.item(1).tagName);//访问了第二个元素alert(allTags[0]);//在JavaScript可以这样访问第一个元素,但这只能是JavaScript里正常运行

getElementsByTagName与getElementsByName都返回NodeList,可以使用item(index)方法访问其中的内容,在JavaScript中还可使用数组形式的下标访问!

创建和操纵节点

迄今为止,已经学过了如何访问文档中的不同节点,不过这仅仅是使用DOM所能实现的功能中的很小一部分。还能添加、删除、替换(或者其他操作)DOM文档中的节点。正是这些功能使得DOM具有真正意义上的动态性。

创建新节点

DOM Document(文档)中有一些方法用于创建不同类型的节点,即便在所有的浏览器中的浏览器document对象并不需要全部支持所有的方法。下面的表格列出了包含在DOM Level 1中的方法,并列出不同的浏览器是否支持项。

方 法描 述IEMOZOPSAFcreateAttribute (name)用给定名称name创建特性节点×××-createCDATASection (text)用包含文本text的文本子节点创建一个CDATA Section-×--createComment(text)创建包含文本text的注释节点××××createDocumentFragment()创建文档碎片节点××××createElement (tagname)创建标签名为tagname的元素××××createEntity Reference(name)创建给定名称的实体引用节点-×--createProcessing Instruction(target, data)创建包含给定targetdata的PI节点-×--createTextNode(text)创建包含文本text的文本节点××××

注:IE = Windows的IE 6;MOZ = 任意平台的Mozilla 1.5;OP=任意平台的Opera 7.5;SAF=MacOS的Safari 1.2

最常用到的几个方法是:createDocumentFragment()、createElement()和createText- Node();其他的一些方法要么就是没什么用(createComment()),要么就是浏览器的支持不够,目前还不太能用。

动态创建一个段落示例

var p = document.createElement("p");//创建一个元素节点,传入标签名var txt = document.createTextNode("创建文本节点,传参数即是文本内容");p.appendChild(txt);//将txt所引用的文本节点插入p到p的最后面(在这里p是空的)//直到现在,页面不会出现任何内容,必须将创建的节点插入到文档中document.body.appendChild(p);//p将出现在最后

移动,删除节点方法及注意事项——appendChild,removeChild,replaceChild,insertBefore

var p1 = document.getElementById("p1");document.body.appendChild(p1);//p1将会被作为body的最后一个子节点,然而页面上仍只有一个pp1.parentNode.removeChild(p1);//removeChild必须是要删除的节点的父节点调用//p1将会从页面上消失,然而它并没有完全消失,我们还可以再将其插入文档document.body.appendChild(p1);//因为变量p1包含了节点的引用var p2 = document.getElementById("p2");p2.parentNode.replaceChild(p1,p2);//p2将会被替换成p1,p2将消失//而p1将从原来的位置移到p2的位置

克隆节点——cloneNode

基于上面的原因,DOM为我们提供了一个克隆节点的方法用于生成一个节点的副本

var p1 = document.getElementById("p1");var p2 = p1.cloneNode();document.body.appendChild(p2);//页面上将会多出一个段落,不过段落中什么都没有p2 = p1.cloneNode(true);//使用参数true表示克隆节点时包含子节点document.body.appendChild(p2);