# DOM
# property 和 attribute
property:修改对象属性,不会体现到html结构中
attribute:修改html属性,会改变html结构
# 事件绑定的方式
嵌入dom
<button onclick="func()">按钮</button>
直接绑定
btn.onclick = function(){}
事件监听
btn.addEventListener('click',function(){},false) 一般是false只冒泡
btn.attachEvent('click',handle)
# DOM事件流与事件委托(代理)
DOM事件流
当事件发生在某个DOM节点上时,事件在DOM结构中进行一级一级的传递,这便形成了“流”,事件流便描述了从页面中接收事件的顺序。
捕获与冒泡
在捕获阶段,事件由window
对象开始,一级一级地向下传递,直到传递到最具体的button
对象上。
事件冒泡阶段与捕获阶段恰好相反,冒泡阶段是从最具体的目标对象开始,一层一层地向上传递,直到window
对象。
事件委托
事件委托又叫事件代理,就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。
ul.addEventListener('click', function(e){
if(e.target.tagName.toLowerCase() === 'li'){
fn() // 执行某个函数
}
})
bug 在于,如果用户点击的是 li 里面的 span,就没法触发 fn,这显然不对。
高级版:点击 span 后,递归遍历 span 的祖先元素看其中有没有 ul 里面的 li。
很好记忆的例子:
简单说,事件委托就是把本来该自己接收的事件委托给自己的上级(父级,祖父级等等)的某个节点,让自己的“长辈们”帮忙盯着,一旦有事件触发,再由“长辈们”告诉自己:“喂,孙子,有人找你~~”。 恩,差不多就是这么个意思,可怜天下父母心。
# JS操作DOM的方法
创建新节点
createDocumentFragment() // 创建一个DOM片段
createElement() // 创建一个具体的元素
createTextNode() // 创建一个文本节点
添加、移除、替换、插入
appendChild()
removeChild()
replaceChild()
insertBefore() // 在已有的子节点前插入一个新的子节点
查找
getElementsByTagName() // 通过标签名称
getElementsByName() // 通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)
getElementById() // 通过元素Id,唯一性
# DOM Tree与Render Tree之间的区别是什么?
Dom Tree 包含了所有的HTMl标签,包括display:none ,JS动态添加的元素等。
Dom Tree 和样式结构体结合后构建呈现Render Tree。Render Tree 能识别样式,每个node都有自己的style,且不包含隐藏的节点(比如display : none的节点)。