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:  }
函数比较多,就不一一详述了。可自行查看。

posted on 2013-05-04 17:39  洞庭啸月  阅读(623)  评论(0编辑  收藏  举报

导航