DOM 事件对象
Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。(W3C)
1. 获取事件对象
<input type="text" class="input-here">
<div class="log"></div>
<script>
var inputEle = document.querySelector('.input-here');
var logEle = document.querySelector('.log');
inputEle.onkeydown = function(event) {
var ele = document.createElement('p');
ele.innerText = '按下了' + event.keyCode;
logEle.appendChild(ele);
}
inputEle.addEventListener('keyup', function(event) {
var ele = document.createElement('p');
ele.innerText = '弹起了' + event.keyCode;
logEle.appendChild(ele);
});
</script>
输入一个字符的动作包含按下键
和松开键
,对应的事件就是 onkeydown
和 onkeyup
,如果使用二级 DOM 事件,则可以不加 on
前缀。
例子中的事件处理器接收了一个参数,这个参数就是事件对象,参数名是可以随意的,一般情况下开发者会选择 e
或者 event
作为参数名。
2.1 属性
2.1.1 target
target表示当前事件最终捕获到的目标。
<div class="a">
我是第一个节点 a
<div class="b">
我是第二个节点 b
<div class="c">
我是第三个节点 c
<div class="d">
我是第四个节点 d
<div class="e">
我是第五个节点 e
<div class="f">
我是最里面的一个元素 f
</div>
</div>
</div>
</div>
</div>
</div>
<div class="result" style="margin-top: px;"></div>
<script>
var resultEle = document.querySelector('.result');
document.querySelector('.a').addEventListener('click', function(e) {
resultEle.innerText = '捕获到的元素类名是' + e.target.className;
});
</script>
可以看到事件绑定在类名为 a
的节点上,点击其子节点的时候,子节点就是最终捕获到的元素。
2.1.2 currentTarget
通过 currentTarget
可以获取到目前触发事件的元素。
<div class="a">
我是第一个节点 a
<div class="b">
我是第二个节点 b
<div class="c">
我是第三个节点 c
<div class="d">
我是第四个节点 d
<div class="e">
我是第五个节点 e
<div class="f">
我是最里面的一个元素 f
</div>
</div>
</div>
</div>
</div>
</div>
<div class="result" style="margin-top: px;"></div>
<script>
var resultEle = document.querySelector('.result');
document.querySelector('.a').addEventListener('click', function(e) {
resultEle.innerText = [
'当前触发事件的元素的类名是:',
e.currentTarget.className,
'。当前捕获到的元素类名是:',
e.target.className,
].join('');
});
</script>
不论点击的是哪个子节点,currentTarget 都是表示当前触发事件的节点。
2.2 方法
2.2.1 stopPropagation
<style>
.list {
width: px;
margin: auto;
}
.list .item {
width: ;
border: px dashed #4caf50;
border-bottom: ;
border-radius: px;
padding: px;
}
.list .item:last-child {
border-bottom: px dashed #4caf50;
}
.list .item button {
border-radius: px;
font-size: px;
color: #666;
outline: none;
}
.list .item button:active {
background: #eee;
}
</style>
<div class="list">
<div class="item">
<p>一句简单的介绍。</p>
<button>点击我删除这条</button>
</div>
<div class="item">
<p>两句简单的介绍。两句简单的介绍。</p>
<button>点击我删除这条</button>
</div>
</div>
<script>
var items = document.querySelectorAll('.list .item');
var btns = document.querySelectorAll('.list .item button');
items.forEach(function(item) {
item.addEventListener('click', function() {
alert('马上进入到详情');
});
});
btns.forEach(function(btn) {
btn.addEventListener('click', function() {
var parent = btn.parentNode;
parent.parentNode.removeChild(parent);
});
});
</script>
<style>
.list {
width: px;
margin: auto;
}
.list .item {
width: ;
border: px dashed #4caf50;
border-bottom: ;
border-radius: px;
padding: px;
}
.list .item:last-child {
border-bottom: px dashed #4caf50;
}
.list .item button {
border-radius: px;
font-size: px;
color: #666;
outline: none;
}
.list .item button:active {
background: #eee;
}
</style>
<div class="list">
<div class="item">
<p>一句简单的介绍。</p>
<button>点击我删除这条</button>
</div>
<div class="item">
<p>两句简单的介绍。两句简单的介绍。</p>
<button>点击我删除这条</button>
</div>
</div>
<script>
var items = document.querySelectorAll('.list .item');
var btns = document.querySelectorAll('.list .item button');
items.forEach(function(item) {
item.addEventListener('click', function() {
alert('马上进入到详情');
});
});
btns.forEach(function(btn) {
btn.addEventListener('click', function(e) {
// 阻止冒泡
e.stopPropagation();
var parent = btn.parentNode;
parent.parentNode.removeChild(parent);
});
});
</script>
2.2.2 preventDefault
<a href="https://imooc.com">冲鸭!!前往网!!</a>
<script>
var aTag = document.querySelector('a');
aTag.onclick = function(e) {
e.preventDefault();
alert('跳转被终止!');
};
</script>
3. 兼容性问题
早期IE下的事件模型与 DOM 标准提供的有些不同。
<div id="ele">
点我
</div>
<script>
var ele = document.getElementById('ele');
ele.onclick = function(e) {
alert(e); // undefined
alert(window.event);
}
</script>
建议对兼容性相关内容做个了解即可,框架通常会处理好兼容性问题。
4. 小结
事件对象包含了事件相关的信息,有事件对象,才能对各个事件做更深层次的交互优化。