jQuery源码学习(版本1.11)-事件处理-实例函数

本文详细探讨jQuery 1.11版本中关于事件处理的实例函数,包括`on()`用于事件绑定,`off()`用于移除事件绑定,以及`trigger()`用于触发事件。通过对这些函数的解析,帮助读者深化对jQuery事件机制的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

本文详细分析jquery-1.11.1.js源码文件行数:568~5269;
代码简介:JQ原型jQuery.fn利用extend扩展了事件处理的方法on-增加事件监听,off-移除事件监听,trigger-触发事件等可有JQ对象实例调用的方法,这些方法会用each对JQ对象实例里的每一个节点都执行相对应的工具方法,即JQ对象实例的事件处理,是作用于内部所有原生dom节点的;
下文进行详细代码分析。

事件处理的实例方法

// 实例对象的事件处理方法
jQuery.fn.extend({

	// 绑定事件方法on(参数one仅限是内部使用,JQ实例对象需要的话可以直接调用后面的one方法)
	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
		var type, origFn;

		// 支持types传入一个map,里面保存types/handlers的场景
		if ( typeof types === "object" ) {
			// selector不为string的场景( types-Object, selector, data )
			if ( typeof selector !== "string" ) {
				// 重定义data,假设data为空,则data = selector,( types-Object, data )
				data = data || selector;
				// 置空selector
				selector = undefined;
			}
			// 遍历对象里的事件类型,逐一调用on
			for ( type in types ) {
				this.on( type, selector, data, types[ type ], one );
			}
			return this;
		}

		// data跟fn同时为空的场景
		if ( data == null && fn == null ) {
			// ( types, fn )
			fn = selector;
			data = selector = undefined;
		} else if ( fn == null ) {
			if ( typeof selector === "string" ) {
				// ( types, selector, fn )
				fn = data;
				data = undefined;
			} else {
				// ( types, data, fn )
				fn = data;
				data = selector;
				selector = undefined;
			}
		}
		if ( fn === false ) {
			fn = returnFalse;
		} else if ( !fn ) {
			return this;
		}

		// 传入了one的场景
		if ( one === 1 ) {
			// 先引用原回调
			origFn = fn;
			// 定义新回调,封装原回调
			fn = function( event ) {
				// 去除绑定
				jQuery().off( event );
				// 执行回调
				return origFn.apply( this, arguments );
			};
			// 从之前分析的jQuery.event代码可知,回调里面保存guid,删除的时候用于会判断,这样才知道解除绑定的是不是同一个回调函数
			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
		}
		
		// 以上各种选择判断分支,均是对不同入参场景进行分类处理
		// 最终还是调用each方法,对JQ对象里的每一个元素,执行jQuery.event.add增加绑定事件
		return this.each( function() {
			jQuery.event.add( this, types, fn, data, selector );
		});
	},
	// one方法,表明事件回调只处理一次
	one: function( types, selector, data, fn ) {
		return this.on( types, selector, data, fn, 1 );
	},
	// 解除事件绑定off
	off: function( types, selector, fn ) {
		var handleObj, type;
		if ( types && types.preventDefault && types.handleObj ) {
			// ( event )  dispatched jQuery.Event
			handleObj = types.handleObj;
			jQuery( types.delegateTarget ).off(
				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
				handleObj.selector,
				handleObj.handler
			);
			return this;
		}
		if ( typeof types === "object" ) {
			// ( types-object [, selector] )
			for ( type in types ) {
				this.off( type, selector, types[ type ] );
			}
			return this;
		}
		if ( selector === false || typeof selector === "function" ) {
			// ( types [, fn] )
			fn = selector;
			selector = undefined;
		}
		if ( fn === false ) {
			fn = returnFalse;
		}
		
		// 前面也是兼容各种入参的场景
		// 最终同样是使用each对JQ对象每个元素调用jQuery.event.remove解除绑定
		return this.each(function() {
			jQuery.event.remove( this, types, fn, selector );
		});
	},

	// 触发事件方法trigger
	trigger: function( type, data ) {
		// 直接使用each方法调用jQuery.event.trigger
		return this.each(function() {
			jQuery.event.trigger( type, data, this );
		});
	},
	// 会影响到前面event.isTrigger的值,用途暂时不明
	triggerHandler: function( type, data ) {
		var elem = this[0];
		if ( elem ) {
			return jQuery.event.trigger( type, data, elem, true );
		}
	}
});


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值