jQuery源码学习第三天--jQuery的静态函数
今天学习jQuery的常见静态函数。看代码:
1: //通过extend方法将对象中的方法赋予jQuery对象
2: jQuery.extend({
3: //交出$的控制权,假如我们需要使用jQuery 之外的另一js库,我们可以通过调用 $.noConflict() 向该库返回控制权。
4: //通过向该方法传递参数true,我们可以将 $ 和 jQuery 的控制权都交还给另一js库
5: noConflict: function( deep ) {},
6: isReady: false,
7: //一个计数器,用于跟踪在ready事件出发前的等待次数
8: readyWait: 1,
9: //继续等待或触发
10: holdReady: function( hold ) {},
11: //文档加载完毕句柄
12: ready: function( wait ) {},
13: //判断是不是函数
14: isFunction: function( obj ) {},
15: //判断是不是数组
16: isArray: Array.isArray || function( obj ) {},
17: //是否是window对象
18: isWindow: function( obj ) {},
19: isNumeric: function( obj ) {},
20: type: function( obj ) {},
21: isPlainObject: function( obj ) {},
22: isEmptyObject: function( obj ) {},
23: error: function( msg ) {},
24: parseHTML: function( data, context, scripts ) {},
25: parseJSON: function( data ) {},
26: parseXML: function( data ) {},
27: noop: function() {},
28: globalEval: function( data ) {},
29: camelCase: function( string ) {},
30: nodeName: function( elem, name ) {},
31: each: function( obj, callback, args ) {},
32: makeArray: function( arr, results ) {},
33: inArray: function( elem, arr, i ) {},
34: merge: function( first, second ) {},
35: grep: function( elems, callback, inv ) {},
36: map: function( elems, callback, arg ) {},
37: guid: 1,
38: proxy: function( fn, context ) {},
39: access: function( elems, fn, key, value, chainable, emptyGet, pass ) {},
40: now: function() {}
41: });
包含了很多函数,比如判断是否是函数、数组、window对象,是否是plain对象,解析html、json、xml等。
1、交出$的控制权
1: //交出$的控制权,假如我们需要使用jQuery 之外的另一js库,
2: //我们可以通过调用 $.noConflict() 向该库返回控制权。
3: noConflict: function( deep ) {
4: if ( window.$ === jQuery ) {
5: window.$ = _$;
6: }
7: //通过传递参数true,我们可以将 $ 和 jQuery 的控制权都交还给另一js库
8: if ( deep && window.jQuery === jQuery ) {
9: window.jQuery = _jQuery;
10: }
11:
12: return jQuery;
13: },
2、判断是不是window对象函数,有很多种方法,jQuery的很多版本的判断方法都不一样,比如1.8之后的版本为:
1: isWindow: function( obj ) {
2: return obj != null && obj == obj.window;
3: }
而之前的版本判断为:
1: isWindow: function( obj ) {
2: return obj && typeof obj === "object" && "setInterval" in obj;
3: },
3、判断对象的类型
1: type: function( obj ) {
2: // 调用Object.prototype.toString方法,生成 "[object Xxx]"格式的字符串
3: // class2type[ "[object " + name + "]" ] = name.toLowerCase();
4: return obj == null ?
5: String( obj ) :
6: class2type[ toString.call(obj) ] || "object";
7: },
这里的class2type函数定义为:
1: // Populate the class2type map
2: jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
3: class2type[ "[object " + name + "]" ] = name.toLowerCase();
4: });
4、解析JSON数据
1: parseJSON: function( data ) {
2: if ( !data || typeof data !== "string") {
3: return null;
4: }
5: // 去除收尾空格
6: data = jQuery.trim( data );
7: // 用JSON.parse(string)方法解析
8: // 反序列化是JSON.stringify(object)
9: if ( window.JSON && window.JSON.parse ) {
10: return window.JSON.parse( data );
11: }
12: // 检查字符串合法性
13: //from http://json.org/json2.js
14: if ( rvalidchars.test( data.replace( rvalidescape, "@" )
15: .replace( rvalidtokens, "]" )
16: .replace( rvalidbraces, "")) ) {
17: return ( new Function( "return " + data ) )();
18: }
19: jQuery.error( "Invalid JSON: " + data );
20: }
5、解析xml:
1: // 解析XML 跨浏览器
2: // parseXML函数也主要是标准API和IE的封装。
3: // 标准API是DOMParser对象。
4: // 而IE使用的是Microsoft.XMLDOM的 ActiveXObject对象。
5: parseXML: function( data , xml , tmp ) {
6: if ( window.DOMParser ) { // Standard 标准XML解析器
7: tmp = new DOMParser();
8: xml = tmp.parseFromString( data , "text/xml" );
9: } else { // IE IE的XML解析器
10: xml = new ActiveXObject( "Microsoft.XMLDOM" );
11: xml.async = "false";
12: xml.loadXML( data );
13: }
14: tmp = xml.documentElement;
15: if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
16: jQuery.error( "Invalid XML: " + data );
17: }
18: return xml;
19: }
6、遍历对象或者数组each:
1: // 遍历对象或数组
2: each: function( obj, callback, args ) {
3: var name,i = 0,length = obj.length,
4: isObj = length === undefined || jQuery.isFunction( obj );
5: // 如果有参数args,调用apply,上下文设置为当前遍历到的对象,参数使用args
6: if ( args ) {
7: if ( isObj ) {
8: for ( name in obj ) {
9: if ( callback.apply( obj[ name ], args ) === false ) {
10: break;
11: }
12: }
13: } else {
14: for ( ; i < length; ) {
15: if ( callback.apply( obj[ i++ ], args ) === false ) {
16: break;
17: }
18: }
19: }
20:
21: // 没有参数args则调用,则调用call,上下文设置为当前遍历到的对象,参数设置为key/index和value
22: } else {
23: if ( isObj ) {
24: for ( name in obj ) {
25: if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
26: break;
27: }
28: }
29: } else {
30: for ( ; i < length; ) {
31: if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
32: break;
33: }
34: }
35: }
36: }
37: return obj;
38: }
函数比较多,就不一一详述了。可自行查看。