事件处理函数的三种方式
方法一:<button class='box' onclick='test()'></button>方法二:var oBtn=document.getElementsByTagName('button')[0];oDiv.onclick=function(){}方法二的优先级大于方法一方法三:IE9一下不支持oBtn.addEventListener('click',function(){//可以绑定多个事件处理函数,前面两种方式连续定义两个事件处理函数,第二个会覆盖第一个//但是这种方式绑定的都会执行},false)下面只会打印一个'1'oBtn.addEventListener('click',test,false)oBtn.addEventListener('click',test,false)function test(){console.log('1')} //因为是同一个事件处理函数方法四:IE8以及一下处理函数 (随便看一下)elem.attachEvent(事件类型,事件处理函数)oBtn.attachEvent('onclick',function(){})
事件执行环境
oBtn.onclick=function(){console.log(this)//指向 oBtn}oBtn.addEventListener('click',function(){//this指向oBtn},false)oBtn.attachEvent('onclick',function(){//this指向windowtest.call(oBtn)})
事件函数的封装
var oBtn=document.getElementsByTagName('button');addEvent(oBtn,'click',function(){})function addEvent(el,type,fn){if(el.addEventListener){el.addEventListener(type,fn,false);}else if(el.attachEvent){el.attachEvent('on'+type,function(){fn.call(el);})}else{el['on'+type]=fn;}}
解除事件
elem.onclick=null/false;element.removeEventListener('click',test,false);element.detachEvent('onclick',test)
argument.callee获取运行函数的引用
oBtn.addEventListener('click',function(){this.className='got';this.innerHtml='已领取';this.removeEventListener('click',arguments.callee,false)},false)
冒泡捕获
从子元素往父元素上冒泡<div class='wrapper'><div class='outer'><div class='inner'></div></div></div>var wrapper=document.getElementsByClassNAme('wrapper')[0];var outer=document.getElementsByClassNAme('outer')[0];var inner=document.getElementsByClassNAme('inner')[0];wrapper.addEventListener('click',function(){console.log('wrapper')},false)outer.addEventListener('click',function(){console.log('outer')},false)inner.addEventListener('click',function(){console.log('inner')},false)点击wrapper:wrapper点击outer:outer wrapper点击inner:inner outer wrapper子元素往父元素上冒泡,要在父元素上也绑定事件,有则执行,没有则继续冒泡
事件捕获
从父元素一层一层往子元素触发<div class='wrapper'><div class='outer'><div class='inner'></div></div></div>var wrapper=document.getElementsByClassNAme('wrapper')[0];var outer=document.getElementsByClassNAme('outer')[0];var inner=document.getElementsByClassNAme('inner')[0];wrapper.addEventListener('click',function(){console.log('wrapper')},true)outer.addEventListener('click',function(){console.log('outer')},true)inner.addEventListener('click',function(){console.log('inner')},true)点击inner:wrapper outer inner如果一个元素既绑定冒泡又绑定捕获,则先执行捕获,事件源不存在捕获与冒泡先绑定谁就先执行谁,事件源只有传递的作用
没有捕获的事件类型
focus blur change submit reset select
ie浏览器没有事件捕获
阻止冒泡默认事件
w3c:e.stopPropagation();ie:e.cancelBubble=true;ie8: event在window上outer.addEventListener('click',function(e){var e=e||window.evente.stopPropagation(); //阻止事件冒泡)},false)
阻止冒泡的封装方法
function cancelBubble(e){var e=e||window.event;if(e.stopPropagation){e.stopPropagation();}else{e.cancelBubble=true;}}
取消默认事件
取消默认事件document.oncontextmenu=function(){ //浏览器鼠标右键return false;//w3c: e.preventDefault() iE9一下不兼容//e.retrunValue=false Ie9一下}a的默认事件是跳转什么都不写就是刷新<a href=value>百度一下</a>value:'javascript:void(0)'':;''#' 锚点 后面什么都不写就会回到顶部<a href='http://www.baidu.con' target='_blank'><div class='inner'>点击</div></a>var inner=document.getElementsByClassName('inner')[0];inner.onclick=function(e){var e=e||window.event;e.preventDefault();}点击div的时候不会提交,其他地方可以提交,因为div部分的默认提交部分被阻止了

