在js中,事件代理和事件委托是什么区别啊,怎么解释啊

JavaScript019

在js中,事件代理和事件委托是什么区别啊,怎么解释啊,第1张

事件代理和事件委托实际上说的是同一件事,只是站在不同的角度来说的。比如说元素A把事件处理委托给自己的父元素B去处理,那么A就是事件委托方,而B就是事件代理方,两者参与的实际上是同一件事。

可以用js的事件委托啊。

比如你的分页生成的代码会插入到一个<div id="pager"></div>里,在生成html片段时为a设置一个属性用来表示页数,如:<a href="#" data-page="1">第1页</a>

事件委托的js代码如下:

$('#pager').delegate('a', 'click', function(e){

e.preventDefault() //阻止a的默认事件

var page = $(this).data('page') //从当前a标签属性中取出页码

//处理分页,如果是跳转:

location.href = "/pagename.php?page=" + page

//如果是异步取分页数据:

var page_api = '/pagedata.php?page=' + page

$.get(page_api, function(data, textStatus, jqXHR){

//使用ajax获取数据

//拼装数据并填充到数据显示区:

$('#list-container').append( createHTML(data) )

//重新生成分页区

createPager( page )

})

})

function createHTML(data){

//拼装数据的函数

}

function createPager(curPage){

//生成分页的函数

var tpl = '<a href="#" data-page="{#index}">第{#index}页</a>'

//...

}

好的废话不多说 我直接给出一份演示

现在我要对id为demo的节点的后代的拥有class test的节点进行监听

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

    <style>

     #demo .test{

         width: 10px

 height: 10px

 background-color: #00AEEF

 margin: 5px

 }

    </style>

</head>

<body>

<div  id="demo">

</div>

<script>

 //获取所有的父节点

 function getParentNode(Obj,Arr){

        if(!Arr){

            var Arr=[]

 }

        Arr.push(Obj)

 if(Obj&&Obj.parentNode){

            getParentNode(Obj.parentNode,Arr)

 }

        return Arr

 }

 //判断是否拥有class

 function hasClass(e,v){

        if(!e.getAttribute)return false

 if(e.getAttribute("class")==null)return false

 var allClass=e.getAttribute("class").split(" ")

 if(allClass.indexOf(v)!=-1){return true}else{return false}

    }

    //事件委托 现在我要对id为demo的节点的后代的拥有class test的节点进行监听

    //添加事件

 document.getElementById("demo").addEventListener("click",function(e){

        e=e||(typeof window.event=="undefined"?event:window.event)//这里对事件对象进行了一个兼容

 var target=typeof e.srcElement=="undefined"? e.target: e.srcElement

 var path=getParentNode(target)

 for(var i=0i<path.lengthi++){

            if(hasClass(path[i],"test")){

                clickTest.call(path[i],e)

 }

        }

        function clickTest(e){

            console.log("你点了这个节点")

 console.log(e)

 console.log(this)

 }

    })

 document.getElementById("demo").innerHTML="<div class='test'><span>"+

 "asdasd</span></div>"

</script>

</body>

</html>

可以看到当我执行domObj.innerHTML=xxx时我是没有对class为test进行添加事件的 但是我点击它执行的函数就是clickTest

具体原理自己看代码吧 我就不详细说了