• DOM事件代码小结


    以下代码出自《DOM Enlightenment》一书
    1.三种事件形式

     1 <body onclick="alert('触发内联属性事件')">
     2     <div>click me</div>
     3 </body>
     4 <script>
     5 var div = document.querySelector('div');
     6 
     7 div.onclick = function() {
     8     alert("触发属性事件");
     9 };
    10 
    11 div.addEventListener('click', function() {
    12     alert('触发addEventListener');
    13 }, false);
    14 </script>

    2.事件流程
    先捕获后冒泡
    捕获:从树主干到分支
    冒泡:从树分支到主干

     1 <html>
     2     <body>
     3         <div>click me to start event flow</div>
     4     </body>
     5 </html>
     6 <script>
     7 // 捕获阶段 window
     8 window.addEventListener('click', function() {
     9     alert(1);
    10 }, true);
    11 
    12 // 捕获阶段 document
    13 document.addEventListener('click', function() {
    14     alert(2);
    15 }, true);
    16 
    17 // 捕获阶段 html
    18 document.documentElement.addEventListener('click', function() {
    19     alert(3);
    20 }, true);
    21 
    22 // 捕获阶段 body
    23 document.body.addEventListener('click', function() {
    24     alert(4);
    25 }, true);
    26 
    27 // 捕获阶段 div
    28 document.querySelector('div').addEventListener('click', function() {
    29     alert(5);
    30 }, true);
    31 
    32 // 冒泡阶段 div
    33 document.querySelector('div').addEventListener('click', function() {
    34     alert(6);
    35 }, false);
    36 
    37 // 冒泡阶段 body
    38 document.body.addEventListener('click', function() {
    39     alert(7);
    40 }, false);
    41 
    42 // 冒泡阶段 html
    43 document.documentElement.addEventListener('click', function() {
    44     alert(8);
    45 }, false);
    46 
    47 // 冒泡阶段 document
    48 document.addEventListener('click', function() {
    49     alert(9);
    50 }, false);
    51 
    52 // 冒泡阶段 window
    53 window.addEventListener('click', function() {
    54     alert(10);
    55 }, false);
    56 
    57 </script>

    3.移除事件

     1 <body>
     2     <div>click to say hi</div>
     3 </body>
     4 <script>
     5 var sayHi = function() {
     6     alert('hi');
     7 };
     8 document.querySelector('div').addEventListener('click', sayHi, false);
     9 
    10 document.querySelector('div').removeEventListener('click', sayHi);
    11 
    12 document.body.addEventListener('click', function() {
    13     alert('hello');
    14 }, false);
    15 
    16 // 不是同一个回调,是不起作用的
    17 document.body.removeEventListener('click', function() {
    18     alert('hello');
    19 });
    20 </script>

    4.事件状态对象

     1 <body>
     2     <div>click me</div>
     3 </body>
     4 <script>
     5 document.querySelector('div').addEventListener('click', function(event) {
     6     console.dir(event);
     7 }, false);
     8 
     9 window.addEventListener('load', function(event) {
    10     console.dir(event);
    11 }, false);
    12 </script>

    5.监听函数this指向
    this指向绑定事件的节点,即event.currentTarget属性

    1 <body>
    2     <div>click me</div>
    3 </body>
    4 <script>
    5 document.body.addEventListener('click', function(event) {
    6     alert(this);
    7     alert(this == event.currentTarget)
    8 });
    9 </script>

    6.获取事件触发元素(事件源头)

    1 <body>
    2     <div>click me</div>
    3 </body>
    4 <script>
    5 document.body.addEventListener('click', function(event) {
    6     alert(event.target);
    7 });
    8 </script>

    7.阻止默认事件

     1 <body>
     2     <a href="http://www.baid.com">链接</a>
     3     <input type="checkbox"/>
     4     <textarea></textarea>
     5 </body>
     6 <script>
     7 
     8 // 点击链接时,阻止跳转
     9 document.querySelector('a').addEventListener('click', function(e) {
    10     e.preventDefault();
    11 });
    12 
    13 // 点击复选框时,阻止选中
    14 document.querySelector('input').addEventListener('click', function(e) {
    15     e.preventDefault();
    16 });
    17 
    18 // 在文本框中尝试输入字符时,阻止输入(使用输入法时,不一定会触发keypress事件)
    19 document.querySelector('textarea').addEventListener('keypress', function(event) {
    20     event.preventDefault();
    21 });
    22 </script>

    8.阻止事件冒泡

     1 <body>
     2     <div>click</div>
     3 </body>
     4 <script>
     5 document.querySelector('div').addEventListener('click', function(e) {
     6     alert('div');
     7     e.stopPropagation();
     8 });
     9 document.body.addEventListener('click', function() {
    10     alert('body');
    11 });
    12 </script>

    9.阻止冒泡和其他相同事件监听器

     1 <body>
     2     <div>click</div>
     3 </body>
     4 <script>
     5 document.querySelector('div').addEventListener('click', function(e) {
     6     alert(1);
     7 });
     8 document.querySelector('div').addEventListener('click', function(e) {
     9     alert(2);
    10     e.stopImmediatePropagation();
    11 });
    12 document.querySelector('div').addEventListener('click', function(e) {
    13     alert(3);
    14 });
    15 document.body.addEventListener('click', function() {
    16     alert('body');
    17 });
    18 </script>

    10.自定义事件

     1 <body>
     2     <div>click</div>
     3 </body>
     4 <script>
     5 var customEvent = document.createEvent('CustomEvent');
     6 // 参数是:name,bubble,cancelable,detail
     7 customEvent.initCustomEvent('hello', true, false,{
     8     msg: 'hello'
     9 });
    10 var div = document.querySelector('div');
    11 div.addEventListener('click', function() {
    12     alert('click');
    13     this.dispatchEvent(customEvent);
    14 })
    15 div.addEventListener('hello', function(e) {
    16     alert(e.detail.msg);
    17 })
    18 </script>

    11.模拟鼠标点击事件

     1 <body>
     2     <div>自动触发</div>
     3 </body>
     4 <script>
     5 var div = document.querySelector('div');
     6 div.addEventListener('click', function() {
     7     alert('click');
     8 })
     9 
    10 var autoClick = document.createEvent('MouseEvent');
    11 // 参数是: name,bubble,cancelable,view,detail,screenx,screeny,clientx,clienty,ctrlkey,altkey,shiftkey,metakey,button,relatedTarget
    12 autoClick.initMouseEvent('click', true, true, document.defaultView,0,0,0,0,0,false,false,false,0,null,null);
    13 div.dispatchEvent(autoClick);
    14 </script>

    12.事件委托

     1 <p>点击某个单元格</p>
     2 <table border="1">
     3     <tr>
     4         <td>row 1 col 1</td>
     5         <td>row 1 col 2</td>
     6     </tr>    
     7     <tr>
     8         <td>row 2 col 1</td>
     9         <td>row 2 col 2</td>
    10     </tr>    
    11     <tr>
    12         <td>row 3 col 1</td>
    13         <td>row 3 col 2</td>
    14     </tr>    
    15     <tr>
    16         <td>row 4 col 1</td>
    17         <td>row 4 col 2</td>
    18     </tr>
    19 </table>
    20 <script>
    21 document.querySelector('table').addEventListener('click', function(event) {
    22     if (event.target.tagName.toLowerCase() == 'td') {
    23         alert(event.target.textContent);
    24     }
    25 });
  • 相关阅读:
    windows2003 系统定时关机
    利用批处理轻松压缩文件
    JavaScript中的常用算法和函数
    ASP.NET Session丢失问题原因及解决方案
    JavaScript文字自动排版
    js图片自动滚动并带翻页的功能
    IE下不显示自定义错误页面
    ArcObject 实现拓扑创建和检查
    ArcGIS Server 的默认设置
    ArcObject 要素删除
  • 原文地址:https://www.cnblogs.com/zywaf/p/7201293.html
Copyright © 2020-2023  润新知