事件流:描述从页面中接收事件的顺序 冒泡 捕获
IE 提出的 事件冒泡流 (Event Bubbling)
Netscape 提出的 事件捕获流 (Event Capturing)
DOM0 onXXX onmouseover onmouseout
DOM1 没有 定义事件模型
DOM2 addEventListener(3个参数) -> W3C规范
removeEventListener
onclick
冒泡 事件源向父级,当父级绑定相同事件时触发父级绑定的事件,其实点击事件所以元素都有,只不过元素默认没有触发事件,为空
捕获 事件源相同的事件,事件源的事件先不触发,找父级是否有相同的事件,找到绑定相同事件的最外层元素,绑定事件与尽量外层同时满足,从那个父元素指向事件源的方向,那个父元素的点击事件触发,再向子元素传递事件,传递到事件源
事件流:
事件捕获:
事件冒泡:
处于捕获:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
</head>
<div></div>
<button></button>
<body>
<script>
var div =document.getElementsByTagName('div')[0];
console.log(div.onclick)
div.onclick = function() {
console.log('div')
}
// div.addEventListener('click',function() {
// console.log('div')
// },false)
console.log(div.onclick)
</script>
</body>
</html>
事件源对象 target srcElement
fixfox : target
IE : srcElement
chrome target srcElement
demo 输出点击li的内容 含包括新增项目
<body>
<button>增加</button>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
</body>
<script>
var oList = document.getElementsByTagName('ul')[0],
oLi = document.getElementsByTagName('li'),
oBtn = document.getElementsByTagName('button')[0],
len = oLi.length,
item;
for(var i = 0;i<len;i++){
item = oLi[i];
item.onclick = function(){
console.log(this.innerText);
}
}
oBtn.onclick = function(){
var li = document.createElement('li');
li.innerText = oLi.length + 1;
oList.appendChild(li);
}
</script>
结果 无法输出新增项目 因为第一次就循环绑定了所有的li 但并不包括后面新增的
事件委托 事件代理
<body>
<button>增加</button>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
</body>
<script>
var oList = document.getElementsByTagName('ul')[0],
oLi = document.getElementsByTagName('li'),
oBtn = document.getElementsByTagName('button')[0],
len = oLi.length,
item;
// 事件委托 事件代理
oList.onclick = function(e){ //事件对象 事件对象有属性,可以找到哪个元素触发了事件
console.log(e);
var e = e || window.event,
tar = e.target || e.srcElement;
console.log(tar.innerText);
}
oBtn.onclick = function(){
var li = document.createElement('li');
li.innerText = oLi.length + 1;
oList.appendChild(li);
}
</script>
打印下标 闭包写法 (缺点无法打印新增项下标)
<body>
<button>增加</button>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
</body>
<script>
var oList = document.getElementsByTagName('ul')[0],
oLi = document.getElementsByTagName('li'),
oBtn = document.getElementsByTagName('button')[0],
len = oLi.length,
item;
// 事件委托 事件代理
oList.onclick = function (e) {
console.log(e);
var e = e || window.event,
tar = e.target || e.srcElement;
// console.log(tar.innerText);
for (var i = 0; i < len; i++) {
item = oLi[i];
if(tar === item){
console.log(i);
}
}
}
oBtn.onclick = function(){
var li = document.createElement('li');
li.innerText = oLi.length + 1;
oList.appendChild(li);
}
</script>
Array.prototype.indexOf.call 写法
<body>
<button>增加</button>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
</ul>
</body>
<script>
var oList = document.getElementsByTagName('ul')[0],
oLi = document.getElementsByTagName('li'),
oBtn = document.getElementsByTagName('button')[0],
len = oLi.length,
item;
// 事件委托 事件代理
oList.onclick = function (e) {
console.log(e);
var e = e || window.event,
tar = e.target || e.srcElement;
// console.log(tar.innerText);
var index = Array.prototype.indexOf.call(oLi,tar);
console.log(index);
}
oBtn.onclick = function(){
var li = document.createElement('li');
li.innerText = oLi.length + 1;
oList.appendChild(li);
}
</script>