避免事件冒泡副作用

优化代码!!!避免事件冒泡副作用
就是在点击子标签的时候我只想要触发子标签的方法,本来不需要提示点击了父标签,但是还是触发了父标签的方法,为了避免这种情况

事件冒泡
事件开始时由最躯体的元素接收,然后逐级向上传播到较为不具体的节点

事件冒泡`

事件捕获
不太具体的节点应该更早接收到事件,二最具体的节点应该最后接收到事件`在这里插入图片描述
“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) { }
},
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值