zoukankan      html  css  js  c++  java
  • js事件代理

    需要注意的blog:http://blog.csdn.net/majian_1987/article/details/8591385

    一篇博客看懂  http://blog.csdn.net/majian_1987/article/details/8591385

    事件代理中明白ul li中的index。

    var targetNode = document.getElementById('list').getElementsByTagName('li');
        var i = 0;
        var targetLength = targetNode.length;
        for (i; i < targetLength; i++) {
            targetNode[i].onclick = (function(num) {
                return function() {
                        alert(num);
                }
            })(i);
        }
    window.onload = function(){
      var oUl = document.getElementById("ul");
      var aLi = oUl.getElementsByTagName("li");
       oUl.onclick = function(ev){ 
        var ev = ev || window.event;
        var target = ev.target || ev.srcElement;
             if(target.nodeName.toLowerCase() == "li"){
                 var that=target;
                 var index;
                 for(var i=0;i<aLi.length;i++)if(aLi[i]===target)index=i;
                 if(index>=0)alert('我的下标是第'+index+'');
                target.style.background = "red";
             }
         
       }
     
    }

    我以前只知道jquery的detegate方法可以给已知元素和未知元素添加事件,现在看看on这个方法的时候,也就知道了。

    $("ul").delegate("li", "click", function () {
            alert($(this).text());
        });

    on的参数和delete的参数是相反的。

    $('#data-list').on('click', 'li', function() {
        $('#data-show').html($(this).html());
    });

    live已经放弃了

    bind与delegate 与on

    bind绑定就是50的话,绑定50个,不能对未来的元素绑定,所以和普通的click方法是一样的。

    delegate的话,可以对未来的元素绑定,亦可以代理。

    on更全面一些。

    只能说这是一篇很好的文章:http://www.jb51.net/article/67166.htm

    js原生的事件代理:

    http://www.oschina.net/question/54100_25614

    https://www.douban.com/note/466024519/?type=like

    自己第一次写原生的事件代理:

    <ul id='list'>
            <li>first</li>
            <li>second</li>
            <li>third</li>
            <li>four</li>
            <li>five</li>
        </ul>
    function addEvent(elm, evType, fn, useCapture) {
            if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);//DOM2.0
            return true;
            }
            else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);//IE5+
            return r;
            }
            else {
            elm['on' + evType] = fn;//DOM 0
            }
        }
        var ss = $('#list')[0];
        var box =function(){
            alert(this.innerHTML);
        }
        addEvent(ss,'click',box);

    不过这个chrome和IE下this只的ul。

    这个原生的你看下:http://www.xiaobai8.com/Blog/464.html

    上边的这个还是没有解决在父类代理的情况下,怎么获取li的索引的问题 ,获取当前li的this的问题。

    下面自己写的这个解决了获得this的问题,但是没有解决索引的问题。我们可以又获取到的dom对象变为jquey对象获取索引方法。

    function addEvent(elm, evType, fn, useCapture) {
            if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);//DOM2.0
            return true;
            }
            else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);//IE5+
            return r;
            }
            else {
            elm['on' + evType] = fn;//DOM 0
            }
        }
        var ss = $('#list')[0];
        var box =function(e){
            var ev= e || window.e;
            var target=ev.target||ev.srcElement;//事件源
            var $li=target.nodeName.toLowerCase();
            if($li==="li"){
                alert(target.innerHTML);
            };
        }
        addEvent(ss,'click',box);
  • 相关阅读:
    C#调用Windows Api播放midi音频
    AutoCAD.net利用Xaml创建Ribbon界面
    WCF 不支持泛型协议 及 通过父类给子类赋值 通过反射加工
    windows右键菜单自动打包发布nuget,没有CI/CD一样方便!
    体验用yarp当网关
    .Net5 中使用Mediatr 中介者模式下的CQRS
    Vue-Router 路由属性解析
    Vue 3.0+Vite 2.0+Vue Router 4.0.6+Vuex 4.0.0+TypeScript +Yarn
    程序设计语言与语言处理程序基础.md
    Visual Studio 2019 舒适性设置
  • 原文地址:https://www.cnblogs.com/coding4/p/5448604.html
Copyright © 2011-2022 走看看