事件流:描述从页面中接收事件的顺序 冒泡 捕获
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>


