11. DOM扩展
- 对DOM的两个主要扩展是
Selectors API和HTML5,还有Element Traversal和一些专有扩展 
11.1 选择符API
querySelector()返回与模式匹配的第一个querySelectorAll()返回NodeListmatchesSelector()返回true/fasle
11.2 元素遍历API
- 对于元素间的空格,除了IE9,所有浏览器会返回文本节点,这会影响childNodes和firstChild等属性
 Element TraversalAPIchildElementCountfirstElementChildlastElementChildpreviousElementSiblingnextElementSiblingchildren
// 旧法遍历
var child = element.firstChild;
while(child != element.lastChild){
	if(child.nodeType == 1){
		process(child); // 是元素
	}
	child = child.nextSibling;
}
// Element Traversal API
var child = element.firstElementChild;
while(child != element.lastElementChild){
	process(child);
	child = child.nextElementSibling;
}
  11.3 HTML5
- 与类相关的扩充    
getElementsByClassName(string): NodeList- 链式调用
 classList, 可以替代classNameadd(value)contains(value)remove(value)toggle(value)
 
删除div的其中一个类名:
<div id="myDiv" class="bd user disabled"></div>
<script> // 旧法靠分割字符串 var className = document.getElementById("myDiv").className.split(/\s+/); var newName = ''; for(let i = 0; i < calssName.length; i++){ if(className[i] !== 'disabled'){ newName += className[i]; } } document.getElementById("myDiv").className = newName; // 新法ClassList,无比简洁 document.getElementById("myDiv").classList.remove("disabled"); </script>
  - 焦点管理    
- 元素获得焦点的方式有:      
- 页面加载、用户输入(Tab)和代码中
focus() 
 - 页面加载、用户输入(Tab)和代码中
 document.activeElement当前获得焦点的元素- 默认,文档刚刚加载完成时,activeElement是body
 - 文档加载期间,activeElement是null
 
document.hasFocus()文档是否获得了焦点
 - 元素获得焦点的方式有:      
 - HTMLDocument的变化    
document.readyState"loading""complete"
- 兼容模式
compatModeCSS1Compat标准模式BackCompat混杂模式
 document.headvar head = document.head || document.getElementsByTagName('head')[0]
document.charset==UTF-16- 自定义数据属性
data- innerHTML返回与调用元素的所有子节点对应的HTML标记outerHTML返回调用它的元素及所有子节点的HTML标记insertAdjacentHTML()"beforebegin""afterbegin""beforeend""afterend"
scrollIntoView()
 
11.4 专有扩展
- 文档模式
document mode<meta http-equiv="X-UA-Compatible" content="IE=IEVersion">- 决定以哪种模式渲染页面
 
 children属性childNodes的Element版本- 返回元素中同样还是元素的子节点
 
contains()compareDocumentPosition()确定节点间的关系- 返回掩码,1无关,2居前,4居后,8包含,16被包含
 
- 插入文本    
innerText永远只会生成当前节点的一个子文本节点textContentouterText读模式下与innerText一致,写模式会扩大到自身
 
12. DOM2 和 DOM3
- DOM2模块    
- 核心
Core - 视图
Views - 事件
Events - 样式
Style - 遍历和范围
Traversal and Range HTML
 - 核心
 - DOM2&3的目的在于扩展DOMAPI,以满足操作XML的所有需求,同时提供更好的错误处理及特性检测能力
 isSameNode()和isEqualNode()- DOM3针对为DOM节点添加额外数据引入了新方法(我测试好像并不支持)    
setUserData(key, value)getUserData(key)
 - 使用短划线的CSS属性,必须转换成驼峰形式才能通过JavaScript访问    
float是保留字,所以相应属性名是cssFloat
 style对象cssTextlengthparentRulegetPropertyCSSValue(propertyName)返回CSSValue对象getPropertyPriority(prop)返回"important"或""getPropertyValue(prop)返回字符串值item(index)removePropety(prop)setProperty(prop, value, priority)
- 偏移量
offset dimension可见大小,含边框、内边距、内容offsetWidth/offsetHeightoffsetTop/offsetLeft
 - 客户区
client dimension不含边框clientWidth/clientHeight
 - 滚动大小
scroll dimensionscrollHeight/scrollWidthscrollTop/scrollLeft被隐藏在内容区域上方/左侧的像素数
 - 确定元素大小    
getBoundingClientRect
 - 遍历    
NodeIterator和TreeWalker- 深度优先的DOM遍历
 
 - 范围    
document.createRange()
 

京公网安备 11010502036488号