事件处理函数的三种方式

  1. 方法一:<button class='box' onclick='test()'></button>
  2. 方法二:var oBtn=document.getElementsByTagName('button')[0];
  3. oDiv.onclick=function(){}
  4. 方法二的优先级大于方法一
  5. 方法三:IE9一下不支持
  6. oBtn.addEventListener('click',function(){
  7. //可以绑定多个事件处理函数,前面两种方式连续定义两个事件处理函数,第二个会覆盖第一个
  8. //但是这种方式绑定的都会执行
  9. },false)
  10. 下面只会打印一个'1'
  11. oBtn.addEventListener('click',test,false)
  12. oBtn.addEventListener('click',test,false)
  13. function test(){console.log('1')} //因为是同一个事件处理函数
  14. 方法四:IE8以及一下处理函数 (随便看一下)
  15. elem.attachEvent(事件类型,事件处理函数)
  16. oBtn.attachEvent('onclick',function(){
  17. })

事件执行环境

  1. oBtn.onclick=function(){console.log(this)//指向 oBtn}
  2. oBtn.addEventListener('click',function(){//this指向oBtn},false)
  3. oBtn.attachEvent('onclick',function(){
  4. //this指向window
  5. test.call(oBtn)
  6. })

事件函数的封装

  1. var oBtn=document.getElementsByTagName('button');
  2. addEvent(oBtn,'click',function(){})
  3. function addEvent(el,type,fn){
  4. if(el.addEventListener){
  5. el.addEventListener(type,fn,false);
  6. }else if(el.attachEvent){
  7. el.attachEvent('on'+type,function(){
  8. fn.call(el);
  9. })
  10. }else{
  11. el['on'+type]=fn;
  12. }
  13. }

解除事件

  1. elem.onclick=null/false;
  2. element.removeEventListener('click',test,false);
  3. element.detachEvent('onclick',test)

argument.callee获取运行函数的引用

  1. oBtn.addEventListener('click',function(){
  2. this.className='got';
  3. this.innerHtml='已领取';
  4. this.removeEventListener('click',arguments.callee,false)
  5. },false)

冒泡捕获

  1. 从子元素往父元素上冒泡
  2. <div class='wrapper'>
  3. <div class='outer'>
  4. <div class='inner'></div>
  5. </div>
  6. </div>
  7. var wrapper=document.getElementsByClassNAme('wrapper')[0];
  8. var outer=document.getElementsByClassNAme('outer')[0];
  9. var inner=document.getElementsByClassNAme('inner')[0];
  10. wrapper.addEventListener('click',function(){console.log('wrapper')},false)
  11. outer.addEventListener('click',function(){console.log('outer')},false)
  12. inner.addEventListener('click',function(){console.log('inner')},false)
  13. 点击wrapper:wrapper
  14. 点击outerouter wrapper
  15. 点击innerinner outer wrapper
  16. 子元素往父元素上冒泡,要在父元素上也绑定事件,有则执行,没有则继续冒泡

事件捕获

  1. 从父元素一层一层往子元素触发
  2. <div class='wrapper'>
  3. <div class='outer'>
  4. <div class='inner'></div>
  5. </div>
  6. </div>
  7. var wrapper=document.getElementsByClassNAme('wrapper')[0];
  8. var outer=document.getElementsByClassNAme('outer')[0];
  9. var inner=document.getElementsByClassNAme('inner')[0];
  10. wrapper.addEventListener('click',function(){console.log('wrapper')},true)
  11. outer.addEventListener('click',function(){console.log('outer')},true)
  12. inner.addEventListener('click',function(){console.log('inner')},true)
  13. 点击innerwrapper outer inner
  14. 如果一个元素既绑定冒泡又绑定捕获,则先执行捕获,事件源不存在捕获与冒泡
  15. 先绑定谁就先执行谁,事件源只有传递的作用

image.png

没有捕获的事件类型

focus blur change submit reset select

ie浏览器没有事件捕获

阻止冒泡默认事件

  1. w3c:e.stopPropagation();
  2. ie:e.cancelBubble=true;
  3. ie8: eventwindow
  4. outer.addEventListener('click',function(e){
  5. var e=e||window.event
  6. e.stopPropagation(); //阻止事件冒泡
  7. )},false)

阻止冒泡的封装方法

  1. function cancelBubble(e){
  2. var e=e||window.event;
  3. if(e.stopPropagation){
  4. e.stopPropagation();
  5. }else{
  6. e.cancelBubble=true;
  7. }
  8. }

取消默认事件

  1. 取消默认事件
  2. document.oncontextmenu=function(){ //浏览器鼠标右键
  3. return false;
  4. //w3c: e.preventDefault() iE9一下不兼容
  5. //e.retrunValue=false Ie9一下
  6. }
  7. a的默认事件是跳转什么都不写就是刷新
  8. <a href=value>百度一下</a>
  9. value:'javascript:void(0)'
  10. ':;'
  11. '#' 锚点 后面什么都不写就会回到顶部
  12. <a href='http://www.baidu.con' target='_blank'>
  13. <div class='inner'>点击</div>
  14. </a>
  15. var inner=document.getElementsByClassName('inner')[0];
  16. inner.onclick=function(e){
  17. var e=e||window.event;
  18. e.preventDefault();
  19. }
  20. 点击div的时候不会提交,其他地方可以提交,因为div部分的默认提交部分被阻止了