事件委托
1. 循环绑定事件
=> 给每一个 li 绑定一个点击事件
=> 浪费性能
=> 对新加进来的元素不友好
2. 事件委托 (事件代理)
=> 把原本需要绑定在子元素的响应事件(click、keydown......)委托给父元素,让父元素担当事件监听的职务。
=> 事件代理的原理是DOM元素的事件冒泡
=> 把所有 li 身上需要绑定的事件绑定给一个共同的结构父级
=> 绑定给 ul
=> 事件目标: 准确触发事件的元素
-> 如果你点击在了 ul 身上, target 就是 ul
-> 如果你点击在了 li 身上, target 就是 li
=> 通过事件目标来判断你点击的确实是 li
-> if(){}
-> 元素节点.nodeName: 大写标签名
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
var lis = document.querySelectorAll('li')
var ul = document.querySelector('ul')
ul.onclick = function(e){
e = e || window.event
var target = e.target || e.srcElement
if(target.nodeName === 'LI'){
console.log('你点击的是li', target)
}
}
优点
需求: 有一个 button 按钮,点击的时候会添加一个 li 进入到 ul
var btn = document.querySelector('button')
btn.onclick = function(){
var li = document.createElement('li')
li.innerText = '新来的'
ul.appendChild(li)
ul.innerHTML += '<li>新来的</li>'
}
var lis = document.querySelectorAll('li')
var ul = document.querySelector('ul')
lis.forEach(function(item){
item.onclick = function(){
console.log(item)
}
})
var btn = document.querySelector('button')
btn.onclick = function(){
var li = document.createElement('li')
li.innerText = '新来的'
ul.appendChild(li)
}
var lis = document.querySelectorAll('li')
var ul = document.querySelector('ul')
ul.onclick = function(e){
e = e || window.event
var target = e.target || e.srcElement
if(target.nodeName === 'LI'){
console.log('你点击的是li', target)
}
}
注意
阻止浏览器的默认行为
+ 什么是浏览器默认行为
=> 不需要我们手动绑定,本身就带有的事件行为
=> a 标签,自带点击行为
=> form 标签,自带表单提交
=> 框选, 自带框选效果
=> 鼠标右键单击,自动弹出一个菜单
=> ...
+ 阻止浏览器默认行为
=> 在同类型事件里面进行阻止
=> 你要阻止 a 的自动跳转,那么你就在 a 标签的点击事件里面阻止
=> 你要阻止 form 标签的表单提交,那么就在 form 标签的 submit 事件里面阻止
=> 1. e.preventDefault()
-> 标准浏览器使用
=> 2. e.returnValue = false
-> IE 低版本
=> 兼容
-> 方式1: if(){}else{}
-> 方式2: try{}catch(err){}
-> 方式3: 直接return false, 有时不好使
var a = document.getElementsByTagName('a')[0]
a.onclick = function(e){
e = e || window.event
console.log('我被点击了')
if(e.preventDefault){
e.preventDefault()
}else{
e.returnValue = false
}
try{e.preventDefault}catch{
e.returnValue = false
}
}
window.onselectstart = function(){
return false
}
window.oncontextmenu = function(){
console.log('右键单击了')
return false
}