HTML5
HTML5 规范定义了一系列与 DOM 规范重叠的 API。
HTML5 的规范涉及面非常广,新增的 DOM API 只是其一部分。
getElementsByClassName()
可以通过
document和所有HTML元素对象调用此方法;返回带有指定类的
NodeList;传入的一个字符串参数 可以包含多个类;
classList 属性
所有元素都拥有,是新集合类型
DOMTokenList的对象实例;访问
classList的项:[]item()classList对象属性:length删除一个元素多个类名中的某个类名的旧版方法:
function removeClass(element, toDelClass) { var classNames = element.className.split(/\s+/); var pos = -1, i, len = classNames.length; for (i = 0; i < len; i++ ) { if (classNames[i] == toDelClass) { pos = i; break; } } classNmaes.splice(i, 1); element.className = classNames.join(' '); } removeClass(document.body, 'any-class');使用
classList对象的方法操作元素的className:var element = document.getElementById('myDiv'); // add(value) -- If already exists do nothing element.classList.add('newClassName'); // >>undefined // contains(value) element.classList.contains('newClassName'); // >>true // remove(value) element.classList.remove('newClassName'); // >> undefined // toggle(value) -- add it when exist otherwise delete it element.classList.toggle('newClassName'); // >> undefined
焦点管理
document.activeElement
document.activeElement指向页面中当前获得了焦点的元素;元素获得焦点的方式:
- 页面加载
- Tab 切换
- 元素的
focus()方法
文档刚加载完,
document.activeElement指向document.body,文档加载期间,document.activeElement指向为null;
document.hasFocus()
该方法用于确定文档是否获得了焦点;
可以通过检测文档是否获得了焦点得知用户是否正在与页面交互.
HTMLDocument 的变化
readyState
属性可用于实现一个文档的加载完成指示器;
loading:正在加载文档;complete:已经加载完成;
兼容模式
document.compatMode可以侦测渲染页面的是标准模式还是混杂模式;两个取值
CSS1Compat:标准模式BackCompat:混杂模式
head 属性
类似
document.body,document.head用于快捷访问文档的head标签;兼容性写法
var head = document.head || document.getElementsByTagName('head')[0]
字符集属性
document.charset属性表示文档实际使用的字符集;document.charset是 可写 的;document.defaultCharset表示操作系统和浏览器默认的字符集,中文操作系统一般是gb2312;
自定义数据属性
HTML5 规定可以为元素添加非标准的属性,但需要添加前缀
data-;自定义数据属性提供的是与渲染无关,但用于存储不可见的重要数据的属性;
元素相应地新增了
dataset属性来 访问和编辑 自定义的属性值var div = document.getElementById('myDiv'); // 写 div.dataset.Id = 123; div.dataset.name = 'yangfch3'; // 读 var Id = div.dataset.Id思路:可以为文档不同位置的元素添加
data-属性,设置加载的百分比,然后该数据可以用于制作加载进度条。
插入标记
innerHTML outerHTML insertAdjacentHTML()
innerHTML
各浏览器返回的 HTML 内容的格式不太一致:部分浏览器会将所有标签转换为大写;不要期望所以浏览器返回的格式相同;
限制(出于安全等方面的考虑):
- 通过 innerHTML 直接插入
<script>元素在大多数中并不会执行其中的脚本; - 通过 innerHTML 直接插入
<style>在一些浏览器中无效。在这些浏览器中,这两个元素被认为是“无作用域的元素”(不会在页面上显示的元素),如果通过 innerHTML 插入的字符串开头就是一个“无作用域的元素”,那么这些浏览器就会在解析这个字符串前先删除该元素。解决方法是:在这些“无作用域的元素”前临时增加一个有作用域的元素,之后再将临时元素删除,同时为脚本元素设置
defer特性。
- 通过 innerHTML 直接插入
部分元素不支持
innerHTML冷知识:FF 浏览器在
XHTML文档中设置innerHTML时要求XHTML必须严格符合要求;最佳实践:使用
innerHTML插入代码片段时,请通过特定的方法过滤掉script标签(可能引入恶意脚本)。
outerHTML
与 innerHTML 的不同点:返回和写入调用它的元素及其所有子节点的 HTML 标签
insertAdjacentHTML() 方法
所有元素新增的方法;
两个参数:插入位置、插入的 HTML 字符串文本
位置参数的取值:
beforebegin:调用元素之前插入;afterend:调用元素之后插入;afterbegin:调用元素的第一个子元素之前;beforeend:调用元素最后一个子元素之后。
与此同时,还有
insertAdjacentElement()用法与insertAdjacentHTML()一致,但第二个参数需传入元素节点。
内存与性能问题
innerHTML等操作会在浏览器底层运行,效率高,但过度使用会使页面性能表现下降;不要频繁使用,最好将要插入的 HTML 先保存在一个字符串内,再一次性插入。
scrollIntoView()
HTML5 为所有的元素节点新增的方法;
接收一个参数:true|false
- true:元素顶部与视口顶部平齐;
- false:元素底部与视口底部平齐。
专有扩展
IE 文档模式属性:
document.documentMode;可以通过 HTML 文档头部的
metaX-UACompatible设置children属性HTMLCollection实例;- 与
childeNodes的不同点是:只包含元素的子节点。
contains()方法 元素的新增方法:一个元素节点参数,检测是否被调用方法的元素包含DOM Level3为元素节点新增方法:compareDocumentPosition()同样接收一个元素节点作为参数,返回掩码的加和:1-无关,2-居前,4-居后,8-包含,16-被包含var result = document.documentElement.compareDocumentPosition(document.body); result; // 4+16contains()兼容代码function contains(refNode, otherNode) { if (typeof refNode.contains == 'function') { return refNode.contains(otherNode); } else if (typeof refNode.compareDocumentPosition == 'function') { return !!(refNode.compareDocumentPosition(otherNode) & 16) } else { var node = otherNode.parentNode; do { if (node === refNode) { return true; } else { node = node.parentNode; } } while (node !== null); return false; } }