develop
sxb 10 months ago
parent f7e7719098
commit f28460e70f

@ -12,219 +12,163 @@
* Date: 2016-05-20T17:17Z * Date: 2016-05-20T17:17Z
*/ */
// 立即执行函数依据不同环境导出jQuery模块接收全局对象和工厂函数作为参数。
(function( global, factory ) { (function( global, factory ) {
// 判断是否为CommonJS环境如Node.js
// 如果在CommonJS环境中如Node.js并且module.exports存在
if ( typeof module === "object" && typeof module.exports === "object" ) { if ( typeof module === "object" && typeof module.exports === "object" ) {
// 根据全局对象有无document属性来决定如何导出jQuery
// 如果全局对象有document属性则直接导出jQuery module.exports = global.document?
// 否则导出一个函数该函数在被调用时会检查是否存在document
module.exports = global.document ?
factory( global, true ) : factory( global, true ) :
function( w ) { function( w ) {
// 如果没有document则抛出错误 // 若传入对象无document属性则抛错提示jQuery依赖含document的window对象
if ( !w.document ) { if (!w.document ) {
throw new Error( "jQuery需要一个包含document的window对象" ); throw new Error( "jQuery需要一个包含document的window对象");
} }
// 否则调用factory函数创建jQuery
return factory( w ); return factory( w );
}; };
} else { } else {
// 在非CommonJS环境中直接调用factory函数 // 非CommonJS环境直接调用工厂函数创建jQuery
factory( global ); factory( global );
} }
}(typeof window!== "undefined"? window : this, function( window, noGlobal ) {
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // 存储已删除ID的数组用于后续相关逻辑可能与DOM元素管理等有关
// 用于存储已删除的ID的数组
var deletedIds = []; var deletedIds = [];
// 获取全局document对象方便后续DOM操作
// 获取全局的document对象
var document = window.document; var document = window.document;
// 借用deletedIds数组的部分方法便于后续直接调用
// 从deletedIds数组借用一些数组方法用于后续操作
var slice = deletedIds.slice; var slice = deletedIds.slice;
var concat = deletedIds.concat; var concat = deletedIds.concat;
var push = deletedIds.push; var push = deletedIds.push;
var indexOf = deletedIds.indexOf; var indexOf = deletedIds.indexOf;
// 用于类名与类型映射的空对象
// 一个空对象,用于存储类名到类型的映射
var class2type = {}; var class2type = {};
// 获取class2type的toString方法用于类型判断等操作
// 获取class2type对象的toString方法
var toString = class2type.toString; var toString = class2type.toString;
// 获取class2type的hasOwnProperty方法判断对象自身属性
// 获取class2type对象的hasOwnProperty方法
var hasOwn = class2type.hasOwnProperty; var hasOwn = class2type.hasOwnProperty;
// 存储浏览器特性支持情况的空对象,用于跨浏览器兼容处理
// 一个空对象,用于存储浏览器支持的特性
var support = {}; var support = {};
// jQuery版本号
// jQuery的版本号
var version = "1.12.4"; var version = "1.12.4";
// jQuery函数返回增强后的init构造函数实例便于链式调用等操作
// 定义jQuery对象它实际上是init构造函数的增强版
var jQuery = function( selector, context ) { var jQuery = function( selector, context ) {
// 如果直接调用jQuery而没有new这里会返回一个新的jQuery.fn.init实例
return new jQuery.fn.init( selector, context ); return new jQuery.fn.init( selector, context );
}; };
// 匹配去除字符串首尾空白字符(含特殊空白字符)的正则
// 匹配并去除字符串开头和结尾的空白字符包括BOM和NBSP
var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
// 匹配以"-ms-"开头字符串的正则,用于处理特定浏览器前缀样式相关
// 匹配以"-ms-"开头的字符串
var rmsPrefix = /^-ms-/; var rmsPrefix = /^-ms-/;
// 匹配替换字符串中“-”后接字母或数字字符的正则,用于样式名等转换
// 匹配并替换字符串中的"-"后跟一个字母或数字的字符
var rdashAlpha = /-([\da-z])/gi; var rdashAlpha = /-([\da-z])/gi;
// 将“-”后接字母转换为大写(用于驼峰命名转换)的回调函数
// 用于将"-"后跟字母的字符串转换为驼峰命名法的回调函数
var fcamelCase = function( all, letter ) { var fcamelCase = function( all, letter ) {
return letter.toUpperCase(); return letter.toUpperCase();
}; };
// jQuery的原型对象包含所有实例方法 // jQuery的原型对象定义众多实例方法
jQuery.fn = jQuery.prototype = { jQuery.fn = jQuery.prototype = {
// 当前jQuery版本号便于版本相关操作及调试查看
// 当前jQuery的版本号
jquery: version, jquery: version,
// 构造函数指向jQuery本身确保原型链正确
// 构造函数指向jQuery本身
constructor: jQuery, constructor: jQuery,
// 初始选择器字符串,后续可能据此操作元素等
// 初始选择器字符串
selector: "", selector: "",
// jQuery对象默认长度为0后续根据选中元素数量更新
// jQuery对象的默认长度为0
length: 0, length: 0,
// 将jQuery对象转换为一个真正数组 // 将jQuery对象转换为真正数组的方法
toArray: function() { toArray: function() {
return slice.call( this ); return slice.call( this );
}, },
// 获取指定位置元素或所有元素组成的数组
// 获取jQuery对象中的第N个元素或者获取所有元素组成的数组
get: function( num ) { get: function( num ) {
return num != null ? return num!= null?
( num < 0? this[ num + this.length ] : this[ num ] ) :
// 返回指定位置的元素
( num < 0 ? this[ num + this.length ] : this[ num ] ) :
// 返回所有元素组成的数组
slice.call( this ); slice.call( this );
}, },
// 把元素数组推入jQuery对象栈并返回新对象的方法
// 将一个元素数组推入到当前jQuery对象的栈中并返回新的jQuery对象
pushStack: function( elems ) { pushStack: function( elems ) {
// 创建一个新的jQuery对象
var ret = jQuery.merge( this.constructor(), elems ); var ret = jQuery.merge( this.constructor(), elems );
// 将旧的对象引用添加到新对象的prevObject属性上
ret.prevObject = this; ret.prevObject = this;
// 保持上下文的一致性
ret.context = this.context; ret.context = this.context;
// 返回新的jQuery对象
return ret; return ret;
}, },
// 遍历jQuery对象元素并执行回调函数的方法
// 对jQuery对象中的每个元素执行一次提供的回调函数
each: function( callback ) { each: function( callback ) {
return jQuery.each( this, callback ); return jQuery.each( this, callback );
}, },
// 对元素映射并返回新jQuery对象的方法
// 将jQuery对象中的每个元素通过提供的回调函数映射到一个新数组中并返回一个新的jQuery对象
map: function( callback ) { map: function( callback ) {
return this.pushStack( jQuery.map( this, function( elem, i ) { return this.pushStack( jQuery.map( this, function( elem, i ) {
return callback.call( elem, i, elem ); return callback.call( elem, i, elem );
}) ); }));
}, },
// 截取部分元素返回新jQuery对象的方法
// 返回一个从当前位置开始包含指定数量元素的新jQuery对象如果参数是负数则从末尾开始计数
slice: function() { slice: function() {
return this.pushStack( slice.apply( this, arguments ) ); return this.pushStack( slice.apply( this, arguments ));
}, },
// 获取第一个元素的方法调用eq(0)实现
// 获取jQuery对象中的第一个元素
first: function() { first: function() {
return this.eq( 0 ); return this.eq( 0 );
}, },
// 获取最后一个元素的方法调用eq(-1)实现
// 获取jQuery对象中的最后一个元素
last: function() { last: function() {
return this.eq( -1 ); return this.eq( -1 );
}, },
// 获取指定位置元素的方法(支持负数索引从后往前计数)
// 获取jQuery对象中指定位置的元素如果索引是负数则从末尾开始计数
eq: function( i ) { eq: function( i ) {
var len = this.length, var len = this.length;
j = +i + ( i < 0 ? len : 0 ); var j = +i + ( i < 0? len : 0 );
return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); return this.pushStack( j >= 0 && j < len? [ this[ j ] ] : [] );
}, },
// 结束当前操作返回上一个jQuery对象若有的方法
// 结束当前操作返回到上一个jQuery对象如果有的话
end: function() { end: function() {
return this.prevObject || this.constructor(); return this.prevObject || this.constructor();
}, },
// 从数组对象借用的方法,用于内部类似数组操作
// 以下方法是从数组对象中借用来的,用于内部使用
push: push, push: push,
sort: deletedIds.sort, sort: deletedIds.sort,
splice: deletedIds.splice splice: deletedIds.splice
}; };
// jQuery.extend方法用于扩展jQuery对象本身或其原型对象 // 用于扩展jQuery对象本身或其原型对象的方法
jQuery.extend = jQuery.fn.extend = function() { jQuery.extend = jQuery.fn.extend = function() {
var src, copyIsArray, copy, name, options, clone, var src, copyIsArray, copy, name, options, clone;
target = arguments[ 0 ] || {}, var target = arguments[ 0 ] || {};
i = 1, var i = 1;
length = arguments.length, var length = arguments.length;
deep = false; var deep = false;
// 处理深度复制情况 // 处理深度复制情况,解析参数相关逻辑
if ( typeof target === "boolean" ) { if ( typeof target === "boolean" ) {
deep = target; deep = target;
// 跳过布尔值和目标对象
target = arguments[ i ] || {}; target = arguments[ i ] || {};
i++; i++;
} }
if ( typeof target!== "object" &&!jQuery.isFunction( target ) ) {
// 如果目标不是对象或函数,则将其转换为对象
if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
target = {}; target = {};
} }
// 如果只有一个参数则扩展jQuery本身
if ( i === length ) { if ( i === length ) {
target = this; target = this;
i--; i--;
} }
// 遍历每一个要扩展的对象 // 遍历要扩展的对象进行扩展操作
for ( ; i < length; i++ ) { for ( ; i < length; i++ ) {
if ( ( options = arguments[ i ] )!= null ) {
// 只处理非null/undefined的值
if ( ( options = arguments[ i ] ) != null ) {
// 扩展基础对象
for ( name in options ) { for ( name in options ) {
src = target[ name ]; src = target[ name ];
copy = options[ name ]; copy = options[ name ];
// 防止无限循环
if ( target === copy ) { if ( target === copy ) {
continue; continue;
} }
// 深度复制的逻辑(略) // 深度复制逻辑(此处省略具体代码),处理合并对象或数组情况
}
}
// Recurse if we're merging plain objects or arrays }
// 定义一个函数,用于扩展对象或合并对象 };
// deep 参数指示是否进行深度拷贝 });
// copy 是要合并到第一个对象中的对象或数组
// target 是被扩展的对象
var someFunction = function( deep, copy, target ) { var someFunction = function( deep, copy, target ) {
// 检查是否进行深度拷贝且copy是一个纯对象或数组 // 检查是否进行深度拷贝且copy是一个纯对象或数组
if ( deep && copy && ( jQuery.isPlainObject( copy ) || if ( deep && copy && ( jQuery.isPlainObject( copy ) ||

Loading…
Cancel
Save