避免事件冒泡副作用

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

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

事件冒泡`

事件捕获
不太具体的节点应该更早接收到事件,二最具体的节点应该最后接收到事件`在这里插入图片描述
“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) { }
},
Kivy 是一个用于开发多点触控应用程序的开源 Python 框架,它支持跨平台运行(如 Windows、macOS、Linux、Android 和 iOS)。在 Kivy 中,事件冒泡(Event Bubbling)是一种事件传播机制,类似于 Web 开发中的事件冒泡模型。它决定了当一个 UI 元素(如按钮或布局)触发事件时,该事件如何在 UI 组件树中传播。 在 Kivy 中,事件冒泡主要发生在控件层次结构中。当某个子控件(如按钮)接收到一个事件(例如 `on_touch_down`)时,该事件会首先在该控件上处理。如果该控件未完全处理该事件(即返回 `False`),则事件会向上传播到其父控件,依此类推,直到事件被完全处理或到达根控件[^1]。 这种机制允许父控件监听并处理其子控件的事件,而无需在每个子控件上单独绑定事件处理逻辑。例如,一个布局可以监听其所有子控件的触摸事件,并根据需要做出响应。 以下是一个简单的代码示例,展示了事件冒泡的行为: ```python from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout class MyButton(Button): def on_touch_down(self, touch): print(f"{self.text} received touch down at {touch.pos}") # Return False to allow the event to bubble up return False class MyLayout(BoxLayout): def on_touch_down(self, touch): print("Layout received touch down") return super().on_touch_down(touch) class EventBubblingApp(App): def build(self): layout = MyLayout() btn1 = MyButton(text='Button 1') btn2 = MyButton(text='Button 2') layout.add_widget(btn1) layout.add_widget(btn2) return layout if __name__ == '__main__': EventBubblingApp().run() ``` 在这个例子中,`MyButton` 类重写了 `on_touch_down` 方法,并返回 `False`,表示事件未被完全处理,因此会继续向上传播到 `MyLayout` 实例。如果 `on_touch_down` 返回 `True`,则事件将被视为已处理,不会继续冒泡。 需要注意的是,Kivy 的事件系统允许开发者通过返回布尔值来控制事件是否继续传播:返回 `True` 表示事件已被处理,停止冒泡;返回 `False` 表示事件应继续向上传播[^1]。 这种事件冒泡机制为构建复杂的 UI 交互提供了灵活性,同时也要求开发者在设计事件处理逻辑时考虑事件传播路径,以避免不必要的副作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值