• javascript之事件处理


    这两天在看《编写可维护的javascript》这本书,今天将事件处理这一章节做个记录,

    首先看一段代码:

     1 <!DOCTYPE HTML> <html> 
     2 <head> 
     3 <meta charset="utf-8" /> 
     4 <title></title>   
     5 <style  type="text/css">
     6     #test{
     7          100px;
     8         height: 100px;
     9         background: red;
    10         position: absolute;
    11     }
    12 </style>
    13 </head>   
    14 <body>   
    15     <div id="test"></div>
    16     <script>
    17         function handleClick(event){
    18             var test = document.getElementById('test');
    19             test.style.left = event.clientX + 'px';
    20             test.style.top = event.clientY + 'px';
    21             test.className = 'reveal';
    22         }
    23         var btn = document.getElementById('btn');
    24         document.addEventListener('click', handleClick);
    25     </script>
    26 </body>   
    27 </html>

    这段代码中click是用户行为来触发的,用户触发后处理handleClick事件,代码看起来合情合理没有任何问题。用户点击的时候,dom移到特定的位置,可如果鼠标移到某个点的时候dom同样需要移动到特定点呢?这个时候这段代码就会出现问题,最好的办法是将应用逻辑(移动到特定点)从事件处理程序中拆分出来。

    function handleClick(event){
        moveDom(event);
    }
    function moveDom(event){
        var test = document.getElementById('test');
        test.style.left = event.clientX + 'px';
        test.style.top = event.clientY + 'px';
        test.className = 'reveal';
    }
    var btn = document.getElementById('btn');
    document.addEventListener('click', function(event){
        handleClick(event);
    });

    这段拆离了应用逻辑,不管用户触发的是click还是mouseover只需要我们都只需要调用 moveDom()即可,不再局限于用户的点击行为。做完这一步,再看下一步。
    event对象代表事件的状态,包含了各种各样的与事件相关的信息。在这段代码中的event对象从click的匿名事件处理中传到handleClick再传到moveDom,共分发了4次,但实际上在我们的应用逻辑中只用到了event(clientX、clientY)两个属性。这有什么问题?首先event对象作为参数传入并不能明确告诉我们该应用中event对象的哪些属性是我们所需要的,其次,当我们想单独测试测试应用逻辑的时候,必须重新创建一个event对象并作为参数传入。因此,我们可以再修改一下代码:

    function handleClick(event){[/backcolor]
                moveDom(event.clientX, event.clientY);
            }
            function moveDom(x, y){
                var test = document.getElementById('test');
                test.style.left = x + 'px';
                test.style.top = y + 'px';
                test.className = 'reveal';
            }
            var btn = document.getElementById('btn');
            document.addEventListener('click', function(event){
                handleClick(event);
            });
    [backcolor=inherit]moveDom(20, 30); //任何地方都可以不依赖event对象和用户行为进行功能测试

    现在不管我们是点击还是移动鼠标还是什么我们都只需要直接调用moveDom()函数即可,甚至可以单独使用moveDom()函数移动dom,由此可以看出拆分应用逻辑代码合理分发event事件对象(不仅是event对象作为参数传入,所有参数传入都应该直观透明)可以有效的解耦代码提高代码的复用性以及使用场合。
    这段代码还有很多地方可以完善,比如定义一个全局对象,将事件处理程序挂载到这个全局对象上,dom对象也作为参数传入,className写入配置数据里。。。。。之后再讲这些吧。

  • 相关阅读:
    使用BitMap进行海量数据去重
    记一次std::process::Child使用过程中碰到的问题
    我的第一篇rust博客
    优秀编程习惯总结
    利用generator模拟协程完美解决异步回调问题
    polymer框架在代码中动态创建需要支持内容分发的自定义元素并挂载到文档中
    属于自己的完美web服务器完成
    web components折腾记
    内边距的妙用
    用js修改带!important的css样式
  • 原文地址:https://www.cnblogs.com/simple294911318/p/3976479.html
Copyright © 2020-2023  润新知