事件定义方式与区别
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>document</title> <style> .contianer{ width: 600px; background-color: blueviolet; } .box1{ height: 300px; width: 500px; background-color: royalblue; } .box2{ height: 100px; width: 300px; background-color: yellowgreen; } </style></head><body id="body"> <div id="contianer" class="contianer"> <div id="box1" class="box1"> <button onclick="btnClick(this)">html事件</button> <button id="btn0">DOM0事件</button> <button id="btn2">DOM2事件</button> <button id="btn3">双击事件</button> <a id="a" href="https://baidu.com">a标签</a> </div> <div id="box2" class="box2"> <span>box2</span> </div> </div> <script> // html事件,缺点:js和html不分开,不推荐这种用法 function btnClick(e){ e.innerHTML = "点击了html事件"; console.log("html事件"); var event = window.event || arguments.callee.caller.arguments[0]; event.stopPropagation(); }; // dom0事件,优点:写起来方便,缺点:事件会被覆盖 var btn0 = document.getElementById("btn0"); btn0.onclick=function(e){ e.target.innerHTML = "点击了dom0事件"; console.log("dom0事件"); e.stopPropagation(); }; btn0.onclick=function(e){ e.target.innerHTML = "点击了dom0事件"; console.log("dom0事件被覆盖了"); e.stopPropagation(); }; // dom2事件,优点:事件不是被覆盖,缺点:写起来麻烦 var btn2 = document.getElementById("btn2"); btn2.addEventListener( 'click',function(e){ e.target.innerHTML = "点击了dom2事件"; console.log("dom2事件1"); e.stopPropagation(); } ); btn2.addEventListener( 'click',function(e){ e.target.innerHTML = "点击了dom2事件"; console.log("dom2事件2"); e.stopPropagation(); } ); //双击事件 var btn3 = document.getElementById("btn3"); btn3.ondblclick = function(e){ e.target.innerHTML = "双击了"; console.log("双击事件"); e.stopPropagation(); }; // 阻止标签默认行为事件 var a = document.getElementById("a"); a.onclick = function(e){ e.target.innerHTML = "点击了a标签"; console.log("a标签事件"); //阻止a标签的默认跳转 e.preventDefault(); e.stopPropagation(); } // 阻止事件冒泡 var contianer = document.getElementById("contianer"); var box1 = document.getElementById("box1"); var box2 = document.getElementById("box2"); contianer.onclick = function(e){ console.log("点击了contianer"); }; box1.onclick = function(e){ console.log("点击了box1"); //阻止事件冒泡,不阻止的话点击box1默认会同时触发contianer的点击事件 e.stopPropagation(); }; box2.onclick = function(e){ console.log("点击了box2"); e.stopPropagation(); }; </script></body></html>
事件委托(代理)
由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听数统一处理多个子元素的事件。这种方法也叫事件委托(代理,delegation):
<body id="body"> <ul id="ul"> <li>a</li> <li>b</li> <li>c</li> </ul> <script> var ul = document.getElementById("ul"); ul.onclick = function(e){ if(e.target.tagName === "LI"){ console.log(e.target.innerHTML); } }; </script></body>
1、HTML DOM 事件
DOM: 指明使用的 DOM 属性级别。
2、鼠标事件
3、键盘事件
4、框架/对象(Frame/Object)事件
5、表单事件