优化代码!!!避免事件冒泡副作用
就是在点击子标签的时候我只想要触发子标签的方法,本来不需要提示点击了父标签,但是还是触发了父标签的方法,为了避免这种情况
事件冒泡
事件开始时由最躯体的元素接收,然后逐级向上传播到较为不具体的节点
`
事件捕获
不太具体的节点应该更早接收到事件,二最具体的节点应该最后接收到事件`
“DOM2级事件”规范要求的事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。
为了避免冒泡的副作用,jQuery提供了mouseenter和mouseleave事件,就使用它们来代替mouseover和mouseout吧
下面这个摘自jQuery的内部函数withinElement,就是为mouseenter和mouseleave提供支持的。翻译了一下注释,仅供大家参考。
// 下面这个函数用于检测事件是否发生在另一个元素的内部
// 在 jQuery.event.special.mouseenter 和 mouseleave 处理程序中使用
var withinElement = function( event ) {
// 检测 mouse(over|out) 是否还在相同的父元素内
var parent = event.relatedTarget;
// 设置正确的事件类型
event.type = event.data;
// Firefox 有时候会把 relatedTarget 指定一个 XUL 元素
// 对于这种元素,无法访问其 parentNode 属性
try {
// Chrome 也类似,虽然可以访问 parentNode 属性
// 但结果却是 null
if ( parent && parent !== document && !parent.parentNode ) {
return;
}
// 沿 DOM 树向上
while ( parent && parent !== this ) {
parent = parent.parentNode;
}
if ( parent !== this ) {
// 如果实际正好位于一个非子元素上面,那好,就处理事件
jQuery.event.handle.apply( this, arguments );
}
// 假定已经离开了元素,因为很可能鼠标放在了一个XUL元素上
} catch(e) { }
},