jQuery事件是DOM事件的封装,提供了一些事件绑定和触发的方法,并且支持自定义事件。
- 绑定事件
- 解绑事件
- 触发事件
对外提供的方法
从源码看
1、绑定事件的bind、delegate最终都是调用jQuery.prototype.on方法,jQuery.prototype.on调用的是一个全局的on方法 on( elem, types, selector, data, fn, one ) ,与on方法的区别:
- bind方法的selector是null,不支持传入selector
- delegate方法只是参数的传入顺序与on方法不同,jQuery 3.0中已弃用此方法,用 on()代替。
2、 移除事件的unbind、undelegate最终都是调用jQuery.prototype.off方法function( types, selector, fn ) ,与off方法的区别:
- unbind方法的selector是null,不支持传入selector
- undelegate方法只是参数的传入顺序与off方法不同
3、 one方法绑定的事件处理器只执行一次,它与on方法相同,调用的全局的on方法
jQuery还提供了一种绑定事件的方法,将事件类型名作为jQuery.prototype的方法属性名,所以我们还可以这样绑定事件:$(‘#id’).click(eventHandler)。
on函数
jQuery.prototype上绑定事件的方法 bind、delegate、on、one最终都是调用全局的on( elem, types, selector, data, fn, one )方法,有这些参数:
- elem 数组类型 要绑定事件的dom元素
- types 事件对象(a map of types/handlers) 或者事件类型(click、change)
- selector 选择器
- data 附加参数,在使用trigger方法触发事件时传入,用户操作触发时,data是undefined
- fn 事件处理函数,事件触发后要做的事情
- one 传入参数为1,事件只执行一次,然后移除事件
on方法的绝大部分代码都是在处理参数不同(数量和类型)的情况下,统一调用jQuery.event.add( this, types, fn, data, selector )方法12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061function on( elem, types, selector, data, fn, one ) {var origFn, type;// Types can be a map of types/handlers// 例如$('#id').on({click:clickHandler,change:changeHandler},'#id0',{name:'on'})if ( typeof types === "object" ) {// 【1】( types-Object, selector, data ) types是object时只有三个参数的情况// 当types是一个对象时,需要对每一个type依次绑定对应的事件处理器// 并在一次调用on方法前做个参数处理if ( typeof selector !== "string" ) {//【2】( types-Object, data )// 如果第三个参数不是string类型,那参数中就没有selector// 例如$('#id').on({click:clickHandler,change:changeHandler},{name:'on'})data = data || selector; // data = null || {name:'on'}selector = undefined;}for ( type in types ) {on( elem, type, selector, data, types[ type ], one );}return elem;}//如果第4位参数data 和第5位参数fn没有,即$('#id').on(param1,param2)这样只有两位参数//elem之后的参数依次是事件类型和事件处理函数if ( data == null && fn == null ) {// 【3】( types, fn ) 只有两个参数,事件类型和事件处理器fn = selector;data = selector = undefined;} else if ( fn == null ) {if ( typeof selector === "string" ) {// 【4】( types, selector, fn ) 三个参数,事件类型,过滤elem后代元素的选择器,事件处理器fn = data;data = undefined;} else {//【5】( types, data, fn )fn = data;data = selector;selector = undefined;}}//【6】fn也可以是一个false值,在on方法中fn为false时,转为一个直接返回false的函数,作为后续调用的jQuery.event.add方法的参数// false值就是做一个直接返回false的函数的简写if ( fn === false ) {fn = return false;} else if ( !fn ) { //如果没有事件处理器就啥也不干,返回这个dom元素return elem;}//【7】事件只会触发一次就移除时,对事件处理函数进行封装//第一次触发执行时,先移除事件处理器,再执行事件if ( one === 1 ) {origFn = fn;fn = function( event ) {// Can use an empty set, since event contains the infojQuery().off( event );return origFn.apply( this, arguments );};// Use same guid so caller can remove using origFnfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );}return elem.each( function() {jQuery.event.add( this, types, fn, data, selector );} );}
jQuery.event.add方法
jQuery.event.add将每个事件处理器封装成事件处理对象,包括唯一标识、事件处理函数、选择器等属性。
当事件绑定顺序如下:
events的内容为:
- 其中guid为事件处理器的唯一标识,事件处理器clickHandler的guid为1,clickHandler1的guid为2。
- events中存放每个事件对应的多个事件处理器对象
- 当类型相同、处理器相同是,也会存入一个事件处理器对象
- 对于同一类型的事件处理器,事件代理处理器总会放在前面
事件绑定用法
12345678910111213function clickHandler(){console.log("事件处理");}$('#J_confirm').click(clickHandler);$('#J_confirm').on('click',clickHandler);$('#J_confirm').on({click: clickHandler,mousedown: clickHandler});$('#J_confirm').bind('click',clickHandler)$('#J_content').on('click','#J_jump',clickHandler);$('#J_content').one('click','#J_jump',clickHandler);$('#J_confirm').one('click',clickHandler);
用trigger触发事件:
off方法
|
|
jQuery.event.remove方法
remove方法最终调用javascript提供的removeEventListener