针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内。写这个主要是当个笔记加总结
存在的问题请你们多多指正!
由于DOM这方面的对象方法操做性都特别强,可是逻辑很简单,因此就没有涉及到实际的代码。
另外这篇不包括DOM2,DOM3的内容javascript
文档对象模型,针对HTML和XML文档的一个API。描绘了一个层次化的结点树,循序开发人员添加,移除修改页面上的一部分。html
DOM把文档描绘成一个由多层节点构成的结构。节点有不一样的类型。节点之间的关系构成了层次。java
文档节点是每一个文档的根节点(Document节点),html节点被称为文档元素。文档元素是最外层的元素,文档中的其余全部元素都包含在文档元素中。HTML页面中,文档元素始终都是html元素。node
DOM1级定义了一个node结构,该结构将由DOM中的全部节点类型实现。这个node接口在javascript中是做为Node类型实现的。除了ie之外全部的浏览器均可以访问到这个类型。浏览器
javascript中的全部节点类型都继承自node类型,所以节点们都共享者相同的基本属性和方法。app
每一个节点都有一个nodetype属性,用于表现节点的类型,节点类型有在Node类型的中定义的12个数值来表示,任何节点都必须是其中之一。dom
NodeType Named Constant 1 ELEMENT_NODE 2 ATTRIBUTE_NODE 3 TEXT_NODE 4 CDATA_SECTION_NODE 5 ENTITY_REFERENCE_NODE 6 ENTITY_NODE 7 PROCESSING_INSTRUCTION_NODE 8 COMMENT_NODE 9 DOCUMENT_NODE 10 DOCUMENT_TYPE_NODE 11 DOCUMENT_FRAGMENT_NODE 12 NOTATION_NODE
节点类型 nodeName 返回 nodeValue返回 1 Element 元素名 null 2 Attr 属性名称 属性值 3 Text text 节点的内容 4 CDATASection cdata-section 节点的内容 5 EntityReference 实体引用名称 null 6 Entity 实体名称 null 7 ProcessingInstruction target 节点的内容 8 Comment comment 注释文本 9 Document document null 10 DocumentType 文档类型名称 null 11 DocumentFragment document 片断 null 12 Notation 符号名称 null
节点关系的属性编码
- childNodes
- firstChild
- lastChild
- parentNodes
- nextSibling
- previousSibling
- owenerDocement
- hasChildNodes
其中childNodes会返回一个NodeList的动态对象,虽然不是Array类型的实例,一样也能够用item()方法,也有length属性。这个NodeList的列表中每一个节点都是彼此的兄弟节点,能够调用nextSibling,previousSibling属性访问他们的兄弟节点。设计
ownerDocument是直接顶到顶,去找顶端的文档节点。code
节点操做的方法:
- appendChild()
- 一个参数,你新加入的节点,默认放到最后
- 若是这个新加入的节点在这个父节点中存在,则将她从原来位置删除而后添加到末尾
- insertBefore()
- 两个参数,要插入的节点和做参照的节点
- 被插入的节点会变成参照节点的前面的同胞节点
- 若参照物是null,则和appendChild同样
- 第二个参数能够是element.firstChild或者element.lastChild,这样能够插入element节点的首节点或者最后一个节点的前一个节点
- replaceChild()
- 两个参数,要插入的节点和被替换的节点
- 返回值是被替换的节点,并从文档中剔除
- cloneNode()
- 参数只有一个布尔值
- true表示深层次复制,复制子节点树
- false表示浅层复制,只复制节点自己,复制后返回接点归文档全部,但她没有父节点,是孤儿,能够经过appendChild(),insertBefore(),replaceChild()等把他插进去
- 他不会复制节点的JS属性和事件,IE会出BUG,因此最好复制以前移除BUG
document对象表示整个HTML界面,并且document对象是window对象的一个属性,因此能够直接调用
只有一个html元素
- childNodes[0],firstChild,dicumentElement都表示一个值,指向html元素
document的属性
- documentElement 指向html元素
- body 指向body元素
- doctype 指向doctype属性
document关于自身信息的属性:
- title 包含着title元素中的文本
- URL 完整的URL
- domain 网页的域名,三个关于URL的属性只有他能够修改,可是不能设置为URL不包含的域
- refierrer 连接到当前页面的URL ,没有则返回NULL
取得元素的对象方法:
- getElementById()
- 只接受一个参数,区分大小写
- 若是有多个同样的ID则只返回第一个
- getElementByTagName()
- 接受一个参数,元素的标签名
- 在HTML中返回的是HTMLCollection对象,也是一个动态集合,和NodeList很是类似,具备item()方法
- 在参数为*时返回全部的标签
- HTMLCollection对象
- item() 能够运用[]的方法在其中加入name属性的字符串返回那一项
- nameItem() 参数能够添加其中的name而后返回HTMLCollection中的name为参数的那一项
- getElementByName()
- 只能找到带有name特性的子节点
- 一样返回的事HTMLCollection对象
- nameItem()只返回第一个HTMLCollection对象,由于HTMLCollection对象里面的项的name都相同
document还有一些特殊的集合,这些集合都是HTMLCollection对象
- anchors
- applets
- forms
- images
- links
- write()
- writelen()
- 上两个方法都是接受一个字符串参数,即要写入到输出流中的文本。ln回家一个换行符,内容都原样加入
- 加入的时候要当心,由于自己JS脚本就带了对script标签,因此转义的时候容易把JS自带的开头和算到一块儿,因此就结束了。因此要变成</script>
- open()
- close()
Element类型用来表示文档中的元素,提供了对元素标签名、子节点及特性的访问
- nodeName属性
- tagName属性
- 上两个会返回元素的标签名,他俩返回的是相等的.tagName主要是为了清晰地表达。
HTML元素都有HTMLElement类型表示,不是经过这个类型,也是经过他的子类型来表示。HTMLElement类型直接继承Element并添加了一些属性,这些在HTML文档上都有体现
- id
- title
- lang 元素内容的语言代码,较少使用
- dir 语言的方向 ltr 或者 rtl
- className
三个主要方法
- getAttribute()
- 传递给方法的特姓名与是实际的特姓名应该是一致的,class不要填className
- 一样能够取到自定义特性
- 特性不须要区分大小写
- 自定义特性根据H5规定须要加data-前缀
- 访问style特性值会返回CSS文本,而直接访问特性值得属性来访问会返回一个对象
- 访问onclick这类时间是会返回相应代码的字符串,而直接访问.属性这样的会被赋值
- setAttribute()
- 接受两个参数,特姓名和特性值
- 若是特性名已存在,则这个操做将会覆盖原来的特性值
- 能够设置自定义属性,可是特姓名会被转为小写
- removeAttribute()
- 传一个参数那就是特姓名,执行完了就会删除他
Element类型是使用attributes属性的惟一一个DOM节点类型。attritubutes属性中包含一个NameNodeMap ,与NodeList相似,也是一个动态集合。下面是attributes对象的方法
- getNameItem():返回nodeName属性等于参数的节点
- removeNamedItem() : 删除列表中nodeName等于参数的节点
- setNameItem(node) : 向列表里添加节点,一节点的nodeName属性为索引
- item(pos) :返回位于数字pos位置处的节点
这个attributes属性费老劲了,除了遍历能用上,感受别的一点用不上啊,直接getAttributes(), setAttribute(), removeAttribute() 就完事了,你在这墨迹啥呢。
function outputAttritubes(element){ var pairs = new Array(), attrName, attrValue, i, len for(i = 0, len = element.attributes.length; i < len; i++ ){ attrName = element.attributes[i].nodeName attrValue = element.attributes[i].nodeValue pairs.push(attrName + '=\''+attrValue + '\'') }
- document.creatElement()
- 里面能够放标签元素,返回的就是一个空的元素,在ie里也能够放一些HTML语言,直接建立出来
在除了IE里,文本节点也算上,因此空格也算是文本节点。因此在chilNodes属性中就不会显示正确的节点。若是须要对element类型的节点进行操做的话最好添加一个element.childNodes[i].nodeType == 1
来判断。不然会默认算上文本节点。
文本节点由Text类型表示,包含的是能够按照字面解释的纯文本内容。纯文本中能够包含转移后HTML字符,可是不能包含HTML代码,TEXT节点的属性:
- nodeValue
- data
- 均可以访问text节点中包含的文本。
- length:保存着字符的数目
下面的方法能够对文本节点进行操做
- appendDate(text):将text添加到文章的末尾
- deleteDate(offset, count): 从offset指定的位置开始删除count个字符
- insertData(offset, text): 从offset指定的位置插入text
- replaceData(offset, count, text):用text替换从offset位置指定到的位置offset+count的位置
- splitText(offset):从offset指定的位置将文本节点分红两个文本节点
- substringData(offset, count): 提取从offset指定的位置开始到offset_count为止的字符串
- doucument.createTextNode()
- 参数是要插入里面的文本,能够按照HTML格式进行编码
- 若是一个元素中有多个文本子节点,则让他们链接起来,中间没有空格
- normalize():在父元素中调用,则会将全部文本节点合并成一个及诶单,节点的nodeValue 是每一个子节点相加
- splitText() 方法 将从第参数个开始分割,而后返回一个新的文本节点包含剩下的内容,该文本节点与原来节点的parentNode相同