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);

 

posted @ 2016-04-30 12:52  飘然离去  阅读(173)  评论(0编辑  收藏  举报