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