首页 > 编程知识 正文

javascript事件委托,jq绑定事件的几种方式

时间:2023-05-04 09:39:28 阅读:170849 作者:4713

委托事件:

比喻:委托事件的事例在现实中比比皆是。 例如,三位同事计划星期一收快递。 有两种方式可以接收快递。 一种是三个人在公司门口等快递;二种是委托前台MM代理接待。 在现实中,我们几乎都采用委托方案。 公司也不会容忍那么多员工站在门口等快递。 前台MM收到快递后,她会判断收件人是谁,根据收件人的要求领取并代为付款。 这个方案还有另一个优点。 也就是说,即使公司来了新员工,前台MM也会在收到给新员工的快递后,进行确认并代为领取。

实现原理:我们知道,当DOM为页面中的每个元素分配事件时,相应的元素通常会在事件冒泡阶段处理事件。 在body div a这样的结构中,单击a元素时,click事件会从a冒泡到div和body,即document对象。 因此,在a上发生的点击事件也可以同样处理div和body要素。 然后,可以利用事件传播(在此为冒泡)机制实现事件的委托。 具体而言,事件请求是事件目标本身不处理事件,而是将处理任务委托给其父要素或祖先要素,以及根要素(document )。

. bind () )

如果有多行多列的表格,则希望用户单击每个单元格时,可以获得有关其内容的更多信息(例如,使用提示栏)。 要执行此操作,请将click事件绑定到每个单元格。

1$(info_tableTD ) ).bind )、function ) )、) { /*显示更多信息*/} );

问题是,如果表中有10列500行用于绑定单击事件,则查找和遍历5000个单元格会大大降低脚本的执行速度,而保存5000个td元素和相应的事件处理程序会占用大量内存

基于前面的例子,如果想要实现简单的相册APP,一页上只显示50张照片的缩略图(50个单元格)。 用户可以单击“第x页”(或“下一页”)链接,在Ajax中从服务器动态加载其他50张照片。 在这种情况下,似乎可以使用. bind ) )方法接受50个单元格绑定事件。

事实并非如此。 bind ) )方法时,单击事件仅绑定到第一页的50个单元格,而动态加载的后续页单元格中没有此单击事件。 换句话说, bind ) )只能将事件绑定到调用它时已经存在的元素,而不能将事件绑定到将来添加的元素。 (就像新员工收不到快递一样。

live------------die )详细解说地址

委托事件可以解决上述两个问题。 更具体地说,请使用. bind (jquery 1.3中新添加的. live )方法,而不是方法。

1$ () #info_tableTD ) ).live )、function ) )、() {/*显示更多信息(/} );

到目前为止,一切似乎都很完美。 很遗憾,不是那样的。 live ) )方法并不完美,因此存在以下主要缺点:

$ )函数搜索当前页中的所有td元素以创建jQuery对象,但检查事件目标时不使用此td元素的集合,而是使用选择器表达式将其与event.target或其祖先元素进行比较。 因此,生成此jQuery对象会产生不必要的开销。

缺省情况下,将事件绑定到$(document )元素。 如果DOM嵌套结构较深,则当事件气泡通过许多祖先元素时,性能会下降

只能直接放置在选定元素的后面,不能用于后续DOM遍历方法的后面。 即$(infotabletd ) ).live…可以,但$ ) ) #infotable ) ).find ) ).live…不行。

通过收集td元素创建jQuery对象,但实际操作的是$(document )对象,令人费解。

解决之道

可以使用称为“早期委托”的hack来避免生成不必要的jQuery对象。 这意味着可以在$(document ).ready () )方法外部调用(.live )。

1 ) function($ )2$ ) ) (info_tableTD ) )、live )、function ) )/*显示更多信息()/) ); 3 ) ) jQuery;

在这里,(function($ ) $(} ) jQuery )是“立即执行的匿名函数”,可以构成闭包以防止名称冲突。 在匿名函数内部,$参数引用jQuery对象。 在DOM准备好之前不会执行此匿名函数。 请注意,使用此hack时,脚本必须在页面的头元素中链接和/或执行。 之所以选择这个时间,正好是因为document元素可用,而且整个DOM还没有生成。 如果将脚本放在已结束的body标记之前,DOM将完全可用,因此没有意义。

为了避免由于事件冒泡而导致性能下降,jQuery支持在使用1.4或更高版本(.live ) )方法时使用上下文参数的组合。

1$ () TD )、$ )、info_table )、0 )、live )、function )、{/*显示更多信息*/} );

详细说明delegate ()链接

如上所述,为了突破单一的. bind ()方法的界限,实现事件的委托,在jQuery 1.3中导入了. live ) )方法。 此后,为了解决“事件链”过长的问题,jQuery 1.4支持为. live ()

方法指定上下文对象。而为了解决无谓生成元素集合的问题,jQuery 1.4.2干脆直接引入了一个新方法.delegate()。

使用.delegate(),前面的例子可以这样写:

1 $("#info_table").delegate("td","click",function(){/*显示更多信息*/});

使用.delegate()有如下优点(或者说解决了.live()方法的如下问题):

直接将目标元素选择符(”td”)、事件(”click”)及处理程序与“受拖方”$(“#info_table”)绑定,不额外收集元素、事件传播路径缩短、语义明确;

支持在连缀的DOM遍历方法后面调用,即支持$(“table”).find(“#info”).delegate…,支持精确控制;

可见,.delegate()方法是一个相对完美的解决方案。但在DOM结构简单的情况下,也可以使用.live()。

提示:使用事件委托时,如果注册到目标元素上的其他事件处理程序使用.stopPropagation()阻止了事件传播,那么事件委托就会失效。

one() 方法为被选元素附加一个或多个事件处理程序,并规定当事件发生时运行的函数。

当使用 one() 方法时,每个元素只能运行一次事件处理器函数。

toggle()

toggle()方法用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件。

trigger()

方法触发被选元素的指定事件类型。

与 trigger() 方法相比的不同之处

它不会引起事件(比如表单提交)的默认行为

.trigger() 会操作 jQuery 对象匹配的所有元素,而 .triggerHandler() 只影响第一个匹配元素。

由 .triggerHandler() 创建的事件不会在 DOM 树中冒泡;如果目标元素不直接处理它们,则不会发生任何事情。

该方法的返回的是事件处理函数的返回值,而不是具有可链性的 jQuery 对象。此外,如果没有处理程序被触发,则这个方法返回 undefined。

另:事件源

IE下 event.srcElement

FF下 event.Target

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。