2020-10-03

    科技2022-07-10  110

    事件的传播机制?

    事件分为2种传播机制(事件流):

    1. 冒泡 (IE提出的事件流是冒泡) 2. 捕获 (谷歌和火狐提出的事件流是捕获)

    什么是冒泡事件?

    1:冒泡事件是由微软公司提出的,从触发底部事件一直延续到最外层,这个现象就是冒泡! 2:只有嵌套关系的标签和都是一样的事件才可能产生冒泡! <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> *{ margin: 0; padding: 0; } div{ width:400px; height: 400px; background: red; } p{ width:200px; height: 200px; background: yellow; } span{ display: block; width:100px; height: 100px; background: yellowgreen; } </style> </head> <body> <div> <p> <span> <button>点击</button> </span> </p> </div> </body> <script type="text/javascript"> var obtn=document.getElementsByTagName('button')[0]; var osapn=document.getElementsByTagName('span')[0]; var op=document.getElementsByTagName('p')[0]; var odiv=document.getElementsByTagName('div')[0]; obtn.onclick=function(){ alert('我是按钮') } osapn.ondblclick=function(){ alert('我是span') } op.ondblclick=function(){ alert('我是p') } odiv.onclick=function(){ alert('我是div') } </script> </html>

    阻止冒泡事件的方法:

    evt.stopPropagation() 无法阻止 IE 低版本事件冒泡; evt.cancelBubble = true; 兼容 IE 低版本冒泡;

    阻止冒泡事件的兼容写法:

    if(evt.cancelBubble){ evt.cancelBubble=true; }else{ evt.stopPropagation(); } <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> *{ margin: 0; padding: 0; } div{ width:400px; height: 400px; background: red; } p{ width:200px; height: 200px; background: yellow; } span{ display: block; width:100px; height: 100px; background: yellowgreen; } </style> </head> <body> <div> <p> <span> <button>点击</button> </span> </p> </div> </body> <script src="js/stop.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> var obtn=document.getElementsByTagName('button')[0]; var osapn=document.getElementsByTagName('span')[0]; var op=document.getElementsByTagName('p')[0]; var odiv=document.getElementsByTagName('div')[0]; obtn.onclick=function(evt){ var e=evt||window.event; alert('我是按钮'); // stopBubble(evt) if(e.stopPropagation){ e.stopPropagation(); }else{ e.cancelBubble = true; } } osapn.onclick=function(evt){ var evt=evt||window.event; alert('我是span'); // stopBubble(evt) } op.onclick=function(evt){ var evt=evt||window.event; alert('我是p'); // stopBubble(evt) } odiv.onclick=function(evt){ var evt=evt||window.event; alert('我是div'); // stopBubble(evt) } </script> </html>

    封装阻止冒泡事件方法:

    function stopBubble(event){ if(event.stopPropagation){ event.stopPropagation(); }else{ event.cancelBubble = true; } }

    什么是event?

    event存在的环境是绑定事件中;event是一个对象,代表事件的状态;event == evet == evt == e; <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <button>点击</button> </body> <script type="text/javascript"> var obtn=document.getElementsByTagName('button')[0]; obtn.onclick=function(evt){ var e=evt||window.event; // alert(arguments.length) // alert(arguments[0])//[object Mouse Event] // console.log(e.type) // console.log(e.target) } // function fn(){ // alert(arguments.length) // alert(arguments[0]) // arguments对象找到函数中的实参 // } // fn('html','css','1') </script> </html>

    event的兼容写法:

    var e=evt||window.event;

    DOM事件处理程序:

    简单来说就是所有的事件叫DOM0事件。 举例: onclick,onmouseover,onmouseout…DOM就是文档对象模型,0是指这个事件的最初版本

    DOM2事件处理程序:

    addEventListener(事件,函数,布尔值) 绑定事件方法 IE不支持 举例: addEventListener('click',function(){ },false)是 true 的话是捕获事件,是 false 的话是冒泡事件;removeEventListener() 删除事件方法 IE不支持

    IE的DOM2方法:

    attachEvent('事件',函数) detachEvent('事件',函数)

    事件委托

    利用冒泡的原理,把事件加到父级上,触发执行效果。 把该是自己的事件交给其他标签来完成,就是事件委托! 把li的事件委托给父元素ul来完成。 事件委托只能是把子元素的事件委托给父元素。

    事件委托的优点:

    提高代码性能,运行速度加快节省内存空间 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <ul> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> </body> <script type="text/javascript"> var oul=document.getElementsByTagName('ul')[0]; var oli=oul.getElementsByTagName('li'); // for(var i=0; i<oli.length; i++){ // oli[i].οnmοuseοver=function(){ // this.style.background='red' // } // } // for(var i=0; i<oli.length; i++){ // oli[i].οnmοuseοut=function(){ // this.style.background='' // } // } oul.onmouseover=function(evt){ var e=evt||window.event;//获取的是鼠标的坐标位置 var t=e.target||e.srcElement; console.log(t) console.log(t.nodeName) if(t.nodeName.toLocaleLowerCase()=='li'){ t.style.background='red'; } } oul.onmouseout=function(evt){ var e=evt||window.event;//获取的是鼠标的坐标位置 var t=e.target||e.srcElement; // console.log(t) if(t.nodeName.toLocaleLowerCase()=='li'){ t.style.background=''; } } </script> </html>

    事件源的兼容

    target 是event对象下面的属性,这个属性指向事件源 event.target 是w3c的写法,ie浏览器不支持 event.srcElement 这是IE的写法(兼容低版本IE)

    兼容写法 var targt=e.target||e.srcElement;

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> div{ width: 200px; height: 200px; background: red; } </style> </head> <body> <div> <button>点击</button> </div> </body> <script type="text/javascript"> var obtn=document.getElementsByTagName('button')[0]; var odiv=document.getElementsByTagName('div')[0]; // obtn.οnclick=function(ev){ alert(ev.target)//[object HTML Button Element] // } odiv.onclick=function(ev){ var e=ev||window.event; // var t=ev.target||ev.srcElement alert(e.srcElement)//[object HTML Button Element] } </script> </html>
    Processed: 0.021, SQL: 8