zoukankan      html  css  js  c++  java
  • 事件委托

    通俗的讲,onclick,onmouseover,onmouseout等这些就是事件

    委托,就是这个事件本来应该加在某些元素上的,而你却加到其他元素上来完成这个事件。

    事件委托原理

    利用事件传播(冒泡)机制,就可以实现事件委托 。具体来说,事件委托就是事件目标自身不处理事件,而是把处理任务委托给其父元素或者祖先元素,甚至根元素(document)来完成

    1.获取当前事件源

      在火狐中获得触发事件的元素(事件源)可以用:

        event.target

      在IE中获得触发事件的元素(事件源)可以用:

        event.srcElement

      // 兼容写法 var Target = event.target||event.srcElement;

    2.事件委托优点

      1,提高性能、效率高

      2,新添加的元素也会有之前的事件

      3,代码量少

    3.获取目标源

      在mouseover事件中,它指向鼠标来自哪个元素

         event.relatedTarget火狐获取触发事件的目标源,与target相反,也是事件委托类型

         fromElement IE获取触发事件的目标源,与srcElement相反,也是事件委托类型

           var from=event.relatedTarget||event.fromElement;

      在mouseout事件中,它指向鼠标去往的那个元素

        event.relatedTarget火狐获取触发事件的目标源,与target相反,也是事件委托类型

        event.toElement IE获取触发事件的目标源,与srcElement相反,也是事件委托类型

           var to=event.relatedTarget||event.toElement;

        parent.onclick=function(ev){
                var e=ev||window.event;
                var target=e.target||e.srcElement;
                console.log(ev);
                if (target.nodeName=='H3') {
                    target.style.background='pink';
                }
                if (target.nodeName=='EM') {
                    target.style.background='blue';
                }
                if (target.nodeName=='SPAN') {
                    target.style.background='orange';
                }
                if (target.id!=parent) {
                    target.style.background='brown';
                }
            }
    box.onclick=function (ev){
                var e=ev||window.event;
                var target=e.target||e.srcElement;
                if (target.nodeName=='LI'&&target.parentNode.id=='list') {
                    target.style.background='pink';
                }
                if (target.nodeName=='LI'&&target.parentNode.id=='list2') {
                    target.style.background='blue';
                }
            }
    var con=document.getElementById('con');
            var btn=document.getElementById('btn');
            var list=document.getElementById('list');
            document.onclick=function(ev){
                var e=ev||window.event;
                var target=e.target||e.srcElement;
                if (target.id=='btn') {
                    list.style.display='block';
                }
                if (target.nodeName=='LI'&&target.parentNode.id=='list') {
                    con.innerHTML=target.innerHTML;
                    list.style.display='none';
                }
                if (target.id!='list'&&target.id!='btn') {
                    list.style.display='none';
                }
            }
  • 相关阅读:
    .net日期类与UNIX时间戳的相互转换,长数字
    钉钉的生日模块在哪
    js判断手机是苹果(IOS)还是安卓(android) H5手机端自适应宽高
    .net网站部署winserver2008R2 IIS只列出目录 浏览只显示目录浏览
    ajax有时请求不到数据 后台,有时收不到返回值的解决办法
    overflow不超出时不显示滚动条 属性解决内容未超出依然显示滚动条轨道的问题
    PB取datawindow生成的语句。要在datawindow的sqlpreview事件
    电脑C盘缓存路径在哪,清理C盘哪个文件夹可以删
    PB里执行写SQL语句
    SQL SERVER合并行。将多行数据合并成一行,字符串拼接
  • 原文地址:https://www.cnblogs.com/SunShineM/p/6067263.html
Copyright © 2011-2022 走看看