大部分的事件會以on為開頭且全小寫(onclick/onchange/onload/onmouseover/...)。
window.onload = function() {
var element= document.getElementById('form-input-id');
element.onsumbit = function() {
// ...
}
}
document事件可被設定在Html上的屬性。
<button onclick="alert('Alert');">click</button>
在Window、Document和所有的Element都有定義addEventListener()方法,
下面程式碼兩種註冊click事件方式,兩者差異在於
var el= document.getElementId('my-id');
el.onclick = function(){
console.log('onclick~');
}
el.addEventListener('click',function(){
console.log('event listener');
},false);
// 移除event listerner
// +-----------------+
// | 下列的方式無效 |
// | 匿名函數無法移除 |
// +-----------------+
el.removeEventListener('click',function(){
console.log('event listener');
},false)
// +-----------------+
// | 下列的方式有效 |
// | 使用具名函數 |
// +-----------------+
functino handleClick(){
console.log('click');
}
el.addEventListener('click',handleClick,false);
el.removeEventListener('click',handleClick,false);
在document元素上觸發的事件大部分都會bubble效果,但focus/blur/scroll事件除外。
事件cature到bubble共有三個階段
<table id="table_id">
<tbody>
<tr>
<td id="A_id">A</td>
</tr>
<tr>
<td>B</td>
</tr>
</tbody>
</table>
<table id="table_id">
和<td id="A_id">
加入addEventListener事件,來觀察bubble和capture。const getTableTag= document.getElementById('table_id');
const getA_td = document.getElementById('A_id');
// +--------------------------------+
// | table_id 在capturing phase觸發 |
// +--------------------------------+
getTableTag.addEventListener('click',function(event){
console.log('table_id capturing:'+event.eventPhase );
},true);
// +--------------------------------+
// | table_id 在bubbling phase觸發 |
// +--------------------------------+
getTableTag.addEventListener('click',function(event){
console.log('table_id bubbling:'+event.eventPhase );
},false);
// +--------------------------------+
// | A_id 在capturing phase觸發 |
// +--------------------------------+
getA_td.addEventListener('click',function(event){
console.log('A_id capturing:'+event.eventPhase );
},true)
// +--------------------------------+
// | A_id 在bubbling phase觸發 |
// +--------------------------------+
getA_td.addEventListener('click',function(event){
console.log('A_id bubbling:'+event.eventPhase );
},false)
<td>A</td>
時
探討兩個情況
<td id="A_id">A</td>
在capture階段會一路從window --> document --> ... --> <table id="table_id">
此時因為有註冊addEventListener在capture階段所以觸發了table_id capturing --> ...
然後傳遞到了target的元素,addEventListener不管是capture或bubble階段都會觸發且都是 event.eventPhase = 2 的階段
在bubble階段再一路從target元素 --> ... --> <table id="table_id">
此時因為有註冊addEventListener在bubble階段所以觸發了table_id bubbling --> ... -->window
可以由下圖的console知道capture與bubble順序
<table id="table_id">
<table id="table_id">
target元素所以capture或bubble階段都會觸發且event.eventPhase = 2的階段