事件绑定,事件冒泡和事件代理详解

来源:互联网 发布:opengl es shader编程 编辑:程序博客网 时间:2024/05/22 20:34

这三个名词听起来很高大上,其实来了解之后你会发现在平时做项目中经常发生。

1.绑定事件.

JS通过addEvent和 addEventLisenter来绑定事件:(可以为同一元素绑定多个事件)

<script>    function addEvent(target, type, handler) {        if (target.addEventListener) {            target.addEventListener(type, handler, false);        } else {            target.attachEvent('on' + type, handler)        }    }    addEvent(document, 'click', function() { alert(this === document) });    addEvent(document, 'click', function() { alert(this === document) });</script>

注意:不要写在html里边(混乱,和上边的方法冲突)
不要用 e.onlick = function(){}(只能绑定一个事件)

jq通过bind() 和 on() 来绑定事件:
不再赘述,很常见。
解除事件绑定:(用命名空间指定的事件)
$(document).unbind(‘click.handler2’); // 解除指定的

2. 事件冒泡

大部分事件会沿着事件触发的目标元素往上传播。比如:body>div>p>span 如果他们都注册了点击事件,那么在 span 元素上触发点击事件后 p,div,body 各自的点击事件也会按顺序触发。

防止事件冒泡的方法:

<script>    function stopPropagation(event) {        event = event || window.event;        if (event.stopPropagation) {            event.stopPropagation()        } else {// IE            event.cancelBubble = true        }    }    addEvent('ele', 'click', function(e) {        // click handler        stopPropagation(e);    });</script>

3.事件代理

给动态添加的元素添加事件绑定,一般绑定的逻辑会在渲染前执行,绑定的时候找不到元素所以并不能成功,当然你也可以把绑定事件的代码放在 Ajax 请求之后。这样做在一些事件逻辑简单的应用里面没问题,但是会加重数据渲染逻辑和事件处理的逻辑耦合。一但事件处程序特别多的时候,我们通常建议将把
事件的逻辑和其它代码逻辑分离。
这样方便维护。

一般做法:

<ul id="list"></ul><script>    function bindEvent(el, n) {        addEvent(lis[i], 'click', function() { console.log(i); });    }    // 用 setTimeout 模拟 Ajax 伪代码    setTimeout(function() {        var ajaxData = '<li id="item-1">item1</li> <li id="item-2">item2</li> <li id="item-3">item3</li> <li id="item-4">item4</li> <li id="item-5">item5</li>';        var ul = document.getElementById('list')        ul.innerHTML(ajaxData);        var lis = ul.getElementsByTagName('li');        for (var i = 0; i < lis.length; i++) {            bindEvent(lis[i], i);        }    }, 1000);</script>

事件代理方法:

<ul id="list"></ul><script>function delegateEvent(el, eventType, fn) {    addEvent(el, eventType, function(event) {        event = event || window.event;        var target = event.target || event.srcElement;        fn(target);    });}var el = document.getElementById('list');// 用 setTimeout 模拟 Ajax 伪代码setTimeout(function() {    var ajaxData = '<li id="item-1">item1</li> <li id="item-2">item2</li> <li id="item-3">item3</li> <li id="item-4">item4</li> <li id="item-5">item5</li>';    el.innerHTML(ajaxData)}, 1000);delegateEvent(el, 'click', function(target) {    console.log(target.id);});</script>
原创粉丝点击