1. DOM 修改
1.1. 内容修改
innerHTML: 获取或设置元素开始标签到结束标签之间的HTML代码片段textContent: 获取或设置元素开始标签到结束标签之间的纯文本内容- 2 件事: 1. 去掉文本中嵌套的标签 2. 将所有转义字符翻译为正文
IE8:innerText.value: 获取或设置表单元素的内容
1.2. 属性修改: 3 类
1.2.1. 标准属性: 2 种
- 标准属性: 在
HTML基础知识里有写到
-
核心
DOM: 4 个API-> 繁琐- 所有属性节点都保存在元素的
attribute集合中 - 获取属性值:
elem.getAttribute('属性名') - 设置 / 修改属性值:
elem.setAttribute('属性名', '属性值) - 是否包含:
elem.hasAttribute('属性名') - 移出属性:
elem.removeAttribute('属性名')
- 所有属性节点都保存在元素的
-
HTML DOM-> 简洁-
HTML DOM将HTML标准属性都封装成了元素对象的属性, 可以直接通过 元素. 访问 -
获取属性值:
elem.属性名 -
设置 / 修改属性值:
elem.属性名 = 属性值 -
是否包含:
elem.属性名 === '' -
移出属性:
elem.属性名 = '' -
特殊:
class属性class属性是JS语言的保留字, 所以DOM中的class属性需要改名为className
-
1.2.2. 状态属性
- 包括:
selected/checked/disabled - 不能通过核心
DOM访问, 只能通过HTM DOM访问
1.2.3. 自定义扩展属性
- Ex:
data-toggle = "dropdown"
- 核心
DOM-> 繁琐- 不能使用
HTML DOM访问
- 不能使用
HTML 5语法 -> 简洁- 设置 / 修改自定义属性值:
data-dataset.属性名 = 值 - 获取自定义属性:
elem.dattset.属性名
- 设置 / 修改自定义属性值:
- 何时:
- 在客户端页面中临时缓存部分业务数据
- 代替
id/class作为查找元素的条件
1.3. 样式修改: 2 种
- 单独修改一个
css属性
1.3.1. 内联:
-
内联样式: 写在元素的
style属性种的样式 -
获取内联样式:
elem.style.css属性名 -
设置 / 修改内联样式:
elem.style.css属性名 = css属性值 -
强调:
css属性名都要去横线变驼峰- Ex:
background-color->backgroundColor
- Ex:
- 所有的
css属性值都是字符串( 可能带单位 )- 计算前都要先去掉单位, 转数字再计算
-
设置内联: 优先级高, 当前元素独有, 不影响其他元素
-
获取内联:
-
问题: 实际开发中可能几乎不包括内联样式 -> 用
elem.style可能无法获得任何样式 -
解决: 用
getComputedStyle(elem)代替elem.style-
getComputedStyle(): 计算后的样式, 最终作用到元素上的所用样式的综合 -
如何:
var style = getComputedStyle(elem)->style.css属性名 -
强调: 计算后的
css属性都是只读- 因为计算后的
css属性可能原来是共用的, 一旦修改, 牵一发而动全身
- 因为计算后的
-
-
1.3.2. 内部 / 外部样式表 -> 危险
- 找到对应的样式表对象:
var sheet = document.stylesheets[i] - 找到
cssRule对象:var cssRule = sheet.cssRules[i]- 如果是
keyframes, 就需要继续找下级的cssRule
- 如果是
- 修改
cssRule的style下的css属性:cssRule.style.css属性名 = css属性值
- 问题: 每次只能修改一个
css属性- 解决: 通过修改元素的
class属性, 来批量应用多个css属性
- 解决: 通过修改元素的
2. DOM 添加、DOM 删除
2.1. DOM 添加: 3 步
- 创建空元素:
var elem = document.createElement('元素名')- Ex:
var createA = document.createElement('a')=><a></a>
- Ex:
- 设置关键属性:
elem.属性名 = 属性值- Ex:
createA.href = 'http://www.baidu.com'->createA.innerHTML = '百度'=><a href="http://www.baidu.com">百度</a>
- Ex:
- 将创建的元素添加到
DOM树指定父元素下- 新建的元素, 只有添加到
DOM树上才能显示出来 - 添加元素: 3 种
- 末尾追加:
parent.appendChild(elem) - 中间插入:
parent.insertBefore(elem, child) - 替换:
parent.replaceChild(elem, child)
- 末尾追加:
- 新建的元素, 只有添加到
-
优化: 尽量减少操作
DOM树-
原理: 页面加载过程
html->DOM Tree↓Render Tree-> ** layout( 计算每个元素的精确布局耗时 ) ** ->paint↑css->CSSRules- 频繁修改
DOM树, 会导致频繁layout, 降低页面响应速度
- 频繁修改
-
解决: 2 种
-
如果需要同时添加父元素和子元素时, 就要在内存中先将子元素添加到父元素, 再将父元素整体一次性添加到
DOM树 -
如果父元素已经在页面上, 要添加多个平级子元素, 就要借助文档片段
-
文档片段: 内存中临时保存多个子元素的虚拟父元素
-
何时: 要添加多个平级子元素
-
如何: 3步
- 创建文档片段:
var frag = document.createDocumentFragment() - 将平级子元素添加到
frag中:frag.appendChild(elem) - 将
frag整体添加到页面父元素下:parent.appendChild(frag)
- 创建文档片段:
-
说明: 将子元素添加到
DOM树后, frag自动释放, 不占用页面空间
-
-
-
-
2.2. DOM 删除
- 删除:
parent.removeChild(child)
3. DOM 常用对象
3.1. Image
指代页面中一个
img元素
- 创建:
var img = new Image()
3.2. Select
指代页面中一个
<select>元素
-
属性
sel.selectedIndex: 获得当前选中项的下标位置sel.value: 获取当前选中项的值(value)- 如果当前
option没有value, 则用innerHTML代替\
- 如果当前
sel.options: 获取当前sel下的所有option元素的集合sel.options.length: 选项的个数sel.options.length = 0: 清除所有选项
sel.length: 选项的个数, 相当于sel.options.lengthsel.length = 0: 清除所有选项
-
方法
-
sel.add(option): 向sel末尾追加一个option-
强调: 不支持文档片段
-
-
sel.remove(i): 移出i位置的选项
-
-
事件
sel.onchange: 当选中项发生改变时触发
3.3. Option
指代页面中一个
option元素
- 创建:
var opt = new Option(text, value) - 属性:
opt.text代替opt.innerHTML
3.4. Table
指代页面中一个
table元素
3.4.1. 管着行分组: 创建, 删除, 获得
- 创建:
var tHead = table.createTHead()var tBody = table.createTBody()var tFoot = table.createTFoot()
- 删除:
table.deleteTHead()table.deleteTFoot()
- 获取:
table.tHeadtable.tBodies[i]table.tFoot
3.4.2. 行分组
-
包括:
tHead/tBody/tFoot-> 管着tr -
创建:
var tr = tXXXX.insertRow(i)-
说明: 如果
i位置有行, 则原位置的行向后顺移 -
常用操作: 1. 末尾追加一行:
tXXXX.insertRow()- 开头插入一行:
tXXXX.insetRow(0)
- 开头插入一行:
-
-
删除:
tXXXX.deleteRow(): 删除当前行分组中下标为i的行 -
获取:
tXXXX.rows
3.4.3. 行 tr
-
管着格
-
创建:
tr.insertCell(i)-
强调:
insetCell只能创建td
-
-
删除:
tr.deleteCell(i) -
获取:
tr.cells
3.4.4. 删除行: 2种
行分组.deleteRow(i)i是行分组内的相对位置, 无法直接获得
table.deleteRow(i)i是行在整个表格中的位置, 可以直接获得tr.rowIndex: 表示tr在整个表格中的位置
-
总结: 今后凡是删除行:
table.deleteRow(tr.rowIndex)
3.5. Form
指代页面中一个
form元素
- 获取:
var formEl = document.forms[i / id] - 属性:
formEl.elements: 获得包含所有表单元素的集合 -> 包含:input/select/button/textareaform.elements.length: 获取表单中表单元素的个数form.length: 获取表单中表单元素的个数, 相当于form.elements.length
- 方法:
form.submit(): 手动提交表单- 只有验证通过才能提交: 2 种
<input type='button' />代替<input type='submit' />- 在
<input type='button' />的单击事件中自己调用form.submit()
- 在
<input type='submit' />配合onsubmit事件
- 只有验证通过才能提交: 2 种
- 表单元素
- 获取:
form.elements[i / id / name]- 更简写: 如果表单元素有
name属性, 可直接:form.name
- 更简写: 如果表单元素有
- 方法:
elem.focus(): 让elem获取焦点elem.blur(): 让elem失去焦点
- 获取: