您的位置:首页 > Web前端 > JQuery

jQuery.on() 函数详解 【转载】

2016-07-26 11:08 253 查看
注意事项

1:on()为指定元素的一个或多个事件绑定事件处理函数。(可传递参数)

2:从jQuery 1.7开始,on()函数提供了绑定事件处理程序所需的所有功能,用于统一取代以前的bind()、 delegate()、 live()等事件函数。

3:即使是执行
on()
函数之后新添加的元素,只要它符合条件,绑定的事件处理函数也对其有效。

4:此外,该函数可以为同一元素、同一事件类型绑定多个事件处理函数。触发事件时,jQuery会按照绑定的先后顺序依次执行绑定的事件处理函数。

5:要删除通过
on()
绑定的事件,请使用off()函数。如果要附加一个事件,只执行一次,然后删除自己,请使用one()函数。

6:该函数属于
jQuery
对象(实例)。

语法

用法一

jQueryObject.on( events [, selector ] [, data ], handler )

用法二

jQueryObject.on( eventsMap [, selector ] [, data ] )

参数

参数描述
eventsString类型 一个或多个用空格分隔的事件类型和可选的命名空间,例如"click"、"focus click"、"keydown.myPlugin"。
eventsMapObject类型  一个Object对象,其每个属性对应事件类型和可选的命名空间(参数
events
),属性值对应绑定的事件处理函数(参数
handler
)。
selector可选/String类型一个jQuery选择器,用于指定哪些后代元素可以触发绑定的事件。如果该参数为
null
或被省略,则表示当前元素自身绑定事件(实际触发者也可能是后代元素,只要事件流能到达当前元素即可)。
data可选/任意类型触发事件时,需要通过event.data传递给事件处理函数的任意数据。
handlerFunction类型指定的事件处理函数。
参数[code]handler
中的
this
指向当前匹配元素的后代元素中触发该事件的DOM元素。如果参数
selector
等于
null
或被省略,则
this
指向当前匹配元素(也就是该元素)。
[/code]
on()
还会为
handler
传入一个参数:表示当前事件的Event对象

参数
handler
的返回值与DOM原生事件的处理函数返回值作用一致。例如"submit"(表单提交)事件的事件处理函数返回
false
,可以阻止表单的提交。

如果事件处理函数
handler
仅仅只为返回
false
值,可以直接将
handler
设为
false


返回值

on()
函数的返回值为jQuery类型,返回当前jQuery对象本身。

重要说明(绑定原理)

如果传递了
selector
参数,那么
on()
函数并不是为当前jQuery对象匹配的元素绑定事件处理函数,而是为它们的后代元素中符合选择器
selector
参数的元素绑定事件处理函数。
on()
函数并不是直接为这些后代元素挨个绑定事件,而是委托给当前jQuery对象的匹配元素来处理。由于DOM 2级的事件流机制,当后代元素
selector
触发事件时,该事件会在事件冒泡中传递给其所有的祖辈元素,当事件流传递到当前匹配元素时,jQuery会判断是哪个后代元素触发了事件,如果该元素符合选择器
selector
,jQuery就会捕获该事件,从而执行绑定的事件处理函数。

问题:

jquery中用on来绑定事件,经常的写法有
$(document).on('click','.classname',function(){});
$('.classname').on('click',function(){});

上面两种都是给类是classname的元素添加了click事件,那这两个写法有什么区别呢?在效率上哪个更好呢?

同样的,
$(document).on('click','#idname',function(){});
$('#idname').on('click',function(){});

这个是个id为idname的原始 绑定click事件,这两种写法又有什么不同呢?

解释:

$(document).on是把事件委托到document上,$('className').on是把事件绑定到.className元素上。效率方面,直接绑定在元素上会更为高效,绑定在document上,每次document有点击动作,浏览器都会判断当前点击的对象,如果匹配,再决定要不要执行,多了一个判断的环节。但在目前开发中,JS渲染效率很高,所以此异同基本可以忽略不计。此外,针对$(document).on的触发特点,延伸一下,$("className").on为onclick绑定,只有在页面onload的时候执行一次,当页面刷新后,新加载的具有className的元素便没有事件绑定到上面了,相反$(document).on这种方法会刷新和重新赋予绑定操作,所以一定程度上更为全面。

原文见 http://www.365mini.com/page/jquery-on.htm / http://bbs.csdn.net/topics/390663982/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: