• 事件委托


    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript">
            window.onload = function () {
                var aUl = document.getElementById("bubble");
                var aLi = aUl.getElementsByTagName("li");
    
                for(var i = 0; i < aLi.length; i++) {
                    aLi[i].onmouseover = function () {
                        this.style.backgroundColor = "blue";
                    };
                    aLi[i].onmouseout = function () {
                        this.style.backgroundColor = "";
                    }
                    aLi[i].onclick = function () {
                        alert(aLi[i]);
                    }
                }
            };
        </script>
    </head>
    <body>
    <div>
        <ul id = "bubble">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
    </div>
    </body>
    

     通过for循环可以实现事件的绑定,但是又与作用链的存在,又导致了一个经典问题

    这里当你点击li标签的时候,都返回undefined,而不是说对应的0,1,2,3。因为变量无法贮存在内存当中。

    解决这个问题有三种方式:(1)闭包,(2)添加新的属性,(3)事件委托

    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    
    <script type="text/javascript">
        window.onload = function () {
    
            function addEvent(doc, lab, eventarg, func) {
    
                if (window.addEventListener) {
                    doc.addEventListener(eventarg, function (evt) {
                        var ev = evt;
                        var tag = ev.target;
    
                        if (tag.nodeName.toLowerCase() == lab.toLowerCase()) {
                            func(tag);
                        }
    
                    }, false);
                }
                else if (window.attachEvent) {
                    doc.attachEvent('on'+eventarg, function (evt) {
                        var ev = window.event;
                        var tag = ev.srcElement;
    
                        if (tag.nodeName.toLowerCase() == lab.toLowerCase()) {
                            func(tag);
                        } 
                    });
                }
            }
    
            var uls = document.getElementById('bubble'); 
            function test(tag) {
                alert(tag.innerHTML);
            }
            addEvent(uls, 'li', 'click', test);
    
    
        };
    </script>
    </head>
    <body>
    <div>
        <ul id = "bubble">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
    </div>
    </body>

    这里就写了一个事件委托的解决方式。 

  • 相关阅读:
    Linux网络编程“惊群”问题总结
    MySql表结构修改详解
    String和ByteBuffer互转
    Java中String连接性能的分析
    java读取TXT文件的方法
    java文件和文件夹复制、删除、移动操作
    eclipse 导出jar 没有主清单属性的解决方法
    storm集群配置
    storm集群部署和配置过程详解
    Apache Zookeeper 集群环境搭建
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4857240.html
Copyright © 2020-2023  润新知