`

事件代理【转】

 
阅读更多

用事件对象的 target 属性,你可以得到触发事件的元素。

事件被激活后,会像猴子一样沿着DOM树从监听节点下滑到触发节点,然后再上爬回监听节点。也就是说,如果你监听了一个DOM节点,那也就等于你监听了其所有的后代节点。代理的意思就是只监听父节点的事件触发,以来代理对其后代节点的监听,而你需要做的只是通过 target 属性得到触发元素并作出回应。来看我下面的例子

<ul id="resources">
  <li><a href="http://developer.mozilla.org">MDN</a></li>
  <li><a href="http://html5doctor.com">HTML5 Doctor</a></li>
  <li><a href="http://html5rocks.com">HTML5 Rocks</a></li>
  <li><a href="http://beta.theexpressiveweb.com/">Expressive Web</a></li>
  <li><a href="http://creativeJS.com/">CreativeJS</a></li>
</ul>

这个例子中的HTML结构是个无序列表,当鼠标悬停会显示相应的标签信息。下面是它JS代码,你将看到它只用到了一个事件监听,然后在处理函数中得到target,以它的 tagName 来进行区分。

var resources = document.querySelector('#resources'),
    log = document.querySelector('#log');

resources.addEventListener('mouseover', showtarget, false);

function showtarget(ev) {
  var target = ev.target;
  if (target.tagName === 'A') {
    log.innerHTML = 'A link, with the href:' + target.href;
  }
  if (target.tagName === 'LI') {
    log.innerHTML = 'A list item';
  }
  if (target.tagName === 'UL') {
    log.innerHTML = 'The list itself';
  }
}

我费事吧啦解释了半天,乃们懂得这么做意味着什么么?这意味着你可以节省大量重复的事件监听,以减少浏览器资源消耗。大多数人可能会用jQuery的$('a').click(...) 啥啥啥的(虽然 jQuery的 on 方法优化的还OK啦不过偶还是蛮鄙视他的),这么做看似一句话蛮带感的,可其实它是把获取到的所有A元素一个一个的注册监听!然后在某个时刻,充斥着无数事件监听的页面终于觉累不爱,自爆以鸣冤屈

她还有一个好处就是让HTML独立起来,比如之后还有要加子元素的需求,也不需要再为其单独加事件监听了。

分享到:
评论

相关推荐

    代理delegate详解,block,gcd

    代理通常用于处理事件响应、数据传递等场景。设置代理需要遵循某个协议(Protocol),该协议定义了代理需要实现的方法。例如,在UITableView中,我们可以定义一个类作为数据源和代理,分别实现UITableViewDataSource...

    自动协议转换的嵌入式SNMP委托代理系统

    - **事件通告处理**:接收来自网络元素(NE)的主动事件报告,并将其转换为SNMP TRAP格式,提交给管理站。 ##### 系统组成 EGPAT系统主要由以下模块构成: - **协议自动映射模块**:负责SNMP与私有协议之间的转换...

    ios设备旋转走的代理(代码附加输出口集合)

    在实际项目中,我们可能会遇到嵌套的视图控制器,这时候处理旋转事件会更复杂。为了确保所有视图控制器的旋转行为一致,我们需要正确地传递这些代理方法的调用。例如,如果一个父视图控制器希望控制子视图控制器的...

    JVM技术,反射与动态代理

    2. 事件监听:通过代理对象拦截方法调用,实现事件的发布和订阅。 动态代理有两种实现方式:基于接口的代理和基于类的代理。前者要求目标类实现一个或多个接口,后者则利用CGLIB等库生成目标类的子类。 总结,JVM...

    java jdk 动态代理 演示demo

    动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将深入探讨这个主题。 首先,我们需要了解Java中的代理模式。代理模式是一种设计模式,它提供一个代理类来控制对原对象...

    Activity代理框架AyoActivityNoManifest.zip

    这个库提供了:一个轻量级的Activity代理框架(ActivityAttacher,使用方式基本和Activity一样),目的在于不必在Manifest反复声明Activity同时提供了一个轻量级的Bundle机制(SimpleBundle,使用方式基本和Bundle...

    销售代理协议独家代理协议精选.doc

    6. **订单处理**:代理商需将收到的订单转给卖方确认,卖方有权接受或拒绝订单,且对于被拒绝的部分,代理方无权索取佣金。 7. **费用分担**:所有与销售相关的费用由代理商承担,而维持代理义务的费用也由代理商...

    netty 代理服务器

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨如何利用 Netty 构建一个 HTTP 代理服务器,以及它的工作原理和核心组件。 HTTP ...

    JAVA反射与代理

    这在处理回调、事件驱动编程或不固定参数列表的场景中非常有用。 动态创建数组并存取元素是反射的另一特性。`Array.newInstance()`可以用来创建任意类型的数组,然后通过`Array.get()`和`Array.set()`操作数组元素...

    C# To JAVA Converter v17.10.6

    当代码中定义事件委托时转换C#事件,或者是System.Action或System.Func代理之一 将所有类型的数组从C#转换成Java 对于继承和接口的所有方面,从C#到Java的无瑕疵转换 允许自定义替换最终转换代码中的字符串 准确...

    Java_neirong.rar_事件触发机制

    在给定的标题“Java_neirong.rar_事件触发机制”和描述中,我们重点关注的是代理模式与事件触发机制的关联。下面我们将详细探讨这两个概念及其在Java中的应用。 首先,让我们理解什么是代理模式。代理模式是结构型...

    automation:总线服务模块,用于代理将事件转换为动作

    "自动化:总线服务模块,用于代理将事件转换为动作"这一标题揭示了一个核心概念,即通过一个中间件或者代理服务来处理事件,并根据预定义的规则或逻辑触发相应的操作。这个总线服务模块扮演着连接不同组件、协调系统...

    第七章国际船舶代理业务.ppt

    4. 复代理,即代理人转委托给第三人执行任务,需要事先获得被代理人的同意。 代理行为可能因以下原因而无效: 1. 无权代理,即未获得授权或超出授权范围的行为。 2. 滥用代理权,即代理人以行使代理权为名,实际上...

    网络游戏服务器架构研究(-)代理服务器的简单实践

    4. **处理并发**:为了处理大量的并发连接,可以采用多线程、异步I/O或事件驱动编程模型。 5. **错误处理**:设置适当的错误处理机制,如超时重试、断线重连等,以应对网络不稳定的情况。 6. **性能优化**:根据...

    WSO2 ESB 协议转换示例(http to jms)

    设置调度策略,如定时或事件驱动。 5. **测试和部署**: 测试通过HTTP发送请求到ESB,确保消息被正确地转换并发送到JMS目的地。你可以通过JMS监听工具(如ActiveMQ的Web Console)验证消息是否到达。 通过这个...

    实现OPCDA与UA的转换及互操作

    3. **转换原理**:实现OPC DA到OPC UA的转换,通常需要一个中间件或网关,这个组件可以称为OPC DA到OPC UA的适配器或代理。适配器监听OPC DA服务器的数据变化,当数据更新时,将这些变化转换为OPC UA的消息格式,并...

    Qt/QML 翻转效果实例

    在这个实例中,我们将关注如何利用QML创建一个具有翻转效果的列表,特别是通过GridView组件来展示数据,并在移动过程中实现代理的半翻转效果。 首先,让我们了解QML中的GridView。GridView是一种布局管理器,它将...

    eel:一个简单的代理服务,用于转发JSON事件并一路转换或过滤它们

    EEL-用于JSON事件转换和转发的简单代理服务 需要达到1.7或更高。 这很简单-传入一个JSON事件,然后发出一个(或几个)转换后的事件。 事件是任意JSON编码的有效负载,它们通常以HTTP POST的形式发送。 EEL是无状态...

    基于Java开发的一款基于Netty的内网穿透工具,主要用于将内网服务反向代理到公网访问.zip

    事件驱动模型使得Netty能够高效处理并发连接,非阻塞I/O则避免了不必要的等待,提高了系统性能。Channel是Netty中的基础概念,代表了一个网络连接;Pipeline是处理请求的链式结构,每个Handler负责一部分业务逻辑;...

Global site tag (gtag.js) - Google Analytics