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