【读书笔记】JavaScript高级程序设计(第3版)(第10-12章)

第10章 DOM

10.1 节点层次

文档元素,文档最外层元素,文档中其他所有元素都包含在文档元素中。HTML中文档元素是<html>。

总共有12种节点类型。

JavaScript中所有节点类型都继承自Node类型,可通过nodeType属性判断节点类型。

对于元素节点,nodeName是标签名,nodeValue为null。

childNodes,用法childNodes[0]或childNodes.item(0)。

parentNode、previousSibling、nextSibling。

hasChildNodes()在节点包含一或多个字节点返回true。

appendChild()向childNodes列表末尾添加一个节点。

insertBefore()接受两个参数:插入的节点和参照的节点。在参照节点前插入一个同胞节点。

replaceChild()、removeChild()。

cloneNode()参数为true进行深复制,为false进行浅复制。

normalize()合并多个相邻文本节点。

nodeName和tagName可以访问元素标签名,输出为大写,比较时需要使用toLowerCase()转换成小写。

元素标准特性,id、title、lang(少用)、dir(少用)、className。

getAttribute()、setAttribute()、removeAttribute()。

只有公认的(非自定义的)特性才会以属性形式添加到DOM对象中。

attributes属性拥有下列方法:getNamedItem(name)、removeNamedItem(name)、setNamedItem(node)、item(pos)。

document.createElement()接受一个参数:要创建的元素名。IE中可用createElement()传入完整的元素标签和属性。

元素的子节点可能是元素、文本、注释或处理指令。

可以使用nodeValue或data属性访问文本节点中包含的文本。

document.createTextNode()创建新文本节点。

splitText(pos)将一个文本节点按照指定位置分成两个文本节点,返回一个新文本节点。

document.createComment()传递注释文本或创建注释节点。

document.createCDataSection()在XML文档中创建CDATA区域。

document.doctype有三个属性:name、entities、notaions。

document.createDocumentFragment()创建文档片段。

Attr对象有三个属性:name、value、specified。

10.2 DOM操作技术

构建表格,table、tbody、tr。

第11章 DOM扩展

11.1 选择符API

querySelector()接收一个css选择符,返回匹配的第一个元素,无则返回null。

querySelectorAll()接收一个css选择符,返回匹配的元素数组。

matchesSelector()接收一个css选择器,如果调用元素与该选择符匹配返回true,否则返回false。不同浏览器需要以不同变体(msMatchesSelector、mozMatchesSelector、webkitMatchesSelector)以支持该方法。

11.2 元素遍历

为弥补不同浏览器使用childNodes等属性行为不一致情况,新增childElementCount、firstElementChild、lastElementChild、previousElementSibling、nextElementSibling。

11.3 HTML5

getElementsByClassName(),接收一个包含一或多个类名的字符串,返回指定类的所有元素数组。

在操作类名时,通过className属性添加、删除和替换类名。

classList属性有add、contains、remove、toggle方法。

document.activeElement属性始终会引用DOM中当前获得了焦点的元素。

document.hasFocus()用于确定文档是否获得了焦点。

document.readyState,用于实现一个指示文档已经加载完成的指示器。有loading和complete两个可能值。

document.compatMode检测浏览器采用哪种渲染模式,CSS1Compat标准模式,BackCompat混杂模式。

document.head引用文档的<head>元素。

document.charset表示文档实际使用的字符集,或指定新字符集,默认值为UTF-16。defaultCharset表示根据默认浏览器及操作系统的设置默认文档的字符集。charset与defaultCharset不同则表示文档字符集有修改。

自定义属性要添加前缀data-,可以使用dataset属性访问。

innerHTML,读模式下返回与调用元素的所有子节点对应的HTML。写模式下根据指定值创建HTML,替换调用元素的所有子节点。

outerHTML,读模式下返回调用元素及所有子节点的HTML。写模式下根据指定值创建HTML,完全替换调用元素。

insertAdjacentHTML()接收两个参数:插入位置和要插入的HTML文本。第一个参数为下列值之一:beforebegin、afterbegin、beforeend、afterend。

使用innerHTML、outerHTML、insertAdjacentHTML()时最好先收工删除要被替换的元素的所有事件处理程序和JavaScript对象属性。

scrollIntoView()通过滚动浏览器窗口或某个容器元素,调用元素就可以出现在视口中。

11.4 专有扩展

文档模式决定页面可以使用什么功能。<meta>中content可以设置IE版本有以下值:Edge、EmulateIE9、EmulateIE8、EmulateIE7、9、8、7、5。

document.documentMode可以知道给定页面是什么文档模式。

children只包含元素中同样还是元素的子节点。

contains()接收一个要检测的后代元素,是则返回true,否则返回false。

compareDocumentPosition(参考节点)确定两个节点间关系,1无关,2局前,4居后,8包含,16被包含。

innerText读取值时,按照由浅入深顺序将文档树中所有文本拼接起来;写入值时,删除元素所有子节点插入包含相应文本值的文本节点。类似属性textContent,Firefox支持。

outerText读取值时,按照由浅入深顺序将文档树中所有文本拼接起来;写入值时,替换整个元素(包含子节点)。

scrollIntoViewIfNeeded(alignCenter)只在当前元素在视口中不可见的情况下,才滚动浏览器窗口或容器元素使其可见。

scrollByLines(lineCount)将元素内容滚动指定的行高。

scrollByPages(pageCount)将元素内容滚动指定的页面高度。

第12章 DOM2和DOM3

12.1 DOM变化

命名空间用xmlns特性指定,想要为XML命名空间创建前缀,可使用xmlns:再后跟前缀。有时为避免不同语言间冲突,也需要使用命名空间来限定特性,如xhtml:class=“home”。

DOM2级中,Node类型包含下列特定于命名空间的属性:localName、namespaceURI、prefix。

DOM3级中,命名空间有关的方法:isDefaultNamespace(namespaceURI)、lookupNamespaceURI(prefix)、lookupPrefix(namespaceURI)。

DOM2级中,Document类型与命名空间有关的方法:createElementNS(namespaceURI,tagName)、createAttributeNS(namespaceURI,attributeName)、getElementsByTagNameNS(namespaceURI,tagName)。

DOM2级核心中,Element操作特性:getAttributeNS(namespaceURI,localName)、getAttributeNodeNS(namespaceURI,localName)、getElementsByTagNameNS(namespaceURI,tagName)、hasAttributeNS(namespaceURI,localName)、removeAttributeNS(namespaceURI,localName)、setAttributeNS(namespaceURI,qualifiedName,value)、setAttributeNodeNS(namespaceURI,attNode)。

NameNodeMap类型与命名空间有关的方法:getNamedItemNS(namespaceURI,localName)、removeNamedItemNS(namespaceURI,localName)、setNamedItemNS(node)。

DocumentType新增三个属性:publicId、systemId、internalSubset。

Document类型变化:importNode(),从文档中取得一个节点导入到另一个文档成为其文档结构一部分。接受2个参数:要复制的节点、是否复制子节点的布尔值。

DOM2级视图新增defaultView属性,IE中为parentWindow,确定文档的归属窗口。

DOM2级核心为document.implementation新增2个新方法:createDocumentType()接受3个参数:文档类型名称、publicId、systemId;createDocument()接受3个参数:针对文档中元素的namespaceURI、文档元素的标签名、新文档的文档类型。

DOM2级HTML为document.implementation新增新方法:createHTMLDocument()创建一个完整的HTML文档,接受一个参数:新创建文档的标题。

Node类型新方法:isSupported()用于确定当前节点具有什么能力,接受2个参数:特性名和特性版本号。

DOM3级两个辅助比较节点的方法:isSameNode()和isEqualNode(),接受一个节点参数,在传入节点与引用节点相同或相等时返回true。相同指两个节点引用同一个对象;相等指两个节点相同类型,具有相等属性。

DOM3级对DOM节点添加额外数据方法:setUserData(),接受3个参数:要设置的键、实际的数据、处理函数。其中处理函数接受5个参数:操作类型值(1复制、2导入、3删除、4重命名)、数据键、数据值、源节点、目标节点。

DOM2级框架新属性:contentDocument,包含一个指针,指向表示框架内容的文档对象。IE8使用contentWindow。

12.2 样式

DOM2级样式为style对象定义的属性和方法:cssText、length、parentRule、getPropertyCSSValue(propertyName)、getPropertyPriority(propertyName)、getPropertyValue(propertyName)、item(index)、removeProperty(propertyName)、setProperty(propertyName,value,priority)。

DOM2级样式增强了document.defaultView,提供了getComputedStyle()方法,接受2个参数:要取得计算样式的元素、一个伪元素字符串。返回CSSStyleDeclaration对象,包含当前元素的所有计算的样式。

通过document.styleSheets可以读取样式表中的属性:disabled(支持读写)、href、media、ownerNode、parentStyleSheet、title、type。

styleSheets还支持cssRules、ownerRule、deleteRule(index)、insertRule(rule,index)。

cssRule对象表示样式表中的每一条规则。包含下列属性:cssText(常用)、parentRule、parentStyleSheet、selectorText(常用)、style(常用)、type。

insertRule()方法可以向现有样式表中添加新规则,接受2个参数:规则文本和表示在哪里插入规则的索引。IE8中相似方法addRule(),该方法最多可以添加4095条样式规则。

deleteRule()删除规则,接受一个参数:要删除的规则的位置。IE支持的方法为removeRule()。

偏移量:offsetHeight、offsetWidth、offsetLeft、offsetTop。想知道某个元素在页面上的偏移量,将这个元素的offsetLeft和offsetTop与其offsetParent的相同属性相加,如此循环至根元素,就可以得到一个基本准确的值。

客户区大小,指元素内容及其内边距所占据的空间大小。clientWidth属性是元素内容区宽度加左右内边距宽度,clientHeight属性是元素内容区高度加上下内边距高度。

滚动大小,指包含滚动内容的元素大小。scrollHeight没有滚动条情况下元素内容的总高度,scrollWidth没有滚动条情况下元素内容的总宽度,scrollLeft被隐藏在内容区域左侧的像素数,scrollTop被隐藏在内容区域上方的像素数。

在确定文档总高度(包括基于视口的最小高度)时,必须取得scrollWidth/clientWidth和scrollHeight/clientHeight中的最大值,才能保证在跨浏览器环境下得到精确结果。

元素尚未滚动时,scrollLeft和scrollTop值为0。

getBoundingClientRect()有4个属性left、top、right、bottom,给出了元素在页面中相对于视口的位置。一般right和left的差值与offsetWidth值相等,bottom和top的差值与offsetHeight值相等。

12.3 遍历

DOM2级遍历和范围定义2个用于辅助完成顺序遍历DOM结构的类型:NodeIterator、TwreeWalker。能够基于给定的起点对DOM结构执行深度优先的遍历操作。

document.createNodeIterator()方法接受4个参数:root、whatToShow(位掩码,以常量形式在NodeFilter类型中定义)、filter、entityReferenceExpansion。调用如document.createNodeIterator(root,NodeFilter.SHOW_ELEMENT,filter,false)。

NodeIterator两个主要方法:nextNode()、previousNode()。

TwreeWalker方法:nextNode()、previousNode()、parentNode()、firstChild()、lastChild()、nextSibling()、previousSibling()。

TwreeWalker属性:currentNode,表示任何遍历方法在上一次遍历中返回的节点。

在使用NodeIterator对象时,NodeFilter.FILTER_SKIP与NodeFilter.FILTER_REJECT作用相同:跳过指定节点。在使用TwreeWalker对象时,NodeFilter.FILTER_SKIP会跳过相应节点继续前进到子树中下一节点,NodeFilter.FILTER_REJECT会跳过相应节点及该节点的整个子树。

12.4 范围

createRange()可以创建DOM范围。

Range类型实例的属性和方法:startContainer、startOffset、endContainer、endOffset。

selectNode()和selectNodeContents()接受一个参数:DOM节点,使用该节点中的信息来填充范围。selectNode()选择整个节点(含子节点),selectNodeContents()只选择节点的子节点。

精细控制范围方法:setStartBefore(refNode)、setStartAfter(refNode)、setEndBefore(refNode)、setEndAfter(refNode)。

创建复杂范围:setStart()和setEnd()。接受两个参数:一个参照节点、一个偏移量值。

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

extractContents()从文档中移除范围选区,返回范围文档片段,可以用于插入到文档中其他地方。

cloneContents()创建范围对象的一个副本,然后在文档其他地方插入该副本。

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

surroundContents()环绕范围插入内容,接受一个参数:环绕范围内容的节点。

折叠范围,指范围中未选择文档的任何部分。

collapse()方法用来折叠范围,接受一个参数:布尔值,表示要折叠到范围的哪一端。true表示起点,false表示终点。

compareBoundaryPoints()确定范围是否有公共边界(起点或终点)。接受2个参数:表示比较方式的常量值、要比较的范围。比较方式常量值:Range.START_TO_START(0)、Range.START_TO_END(1)、Range.END_TO_END(2)、Range.END_TO_START(3)。compareBoundaryPoints()可能返回的值:第一个范围中的点位于第二个范围中的点前,返回-1;两点相等,返回0;第一个范围中的点位于第二个范围中的点后,返回1。

cloneRange()复制范围,创建调用它的范围的副本。

detach()调用完范围后,从创建范围文档中分离出该范围。通常与range=null连用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容