zoukankan      html  css  js  c++  java
  • 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:  }
    函数比较多,就不一一详述了。可自行查看。
  • 相关阅读:
    07-0.部署 worker 节点
    06-4.部署高可用 kube-scheduler 集群
    06-3.部署高可用 kube-controller-manager 集群
    vim 查找并替换多个匹配字符
    vim 行号的显示与隐藏
    Python学习【第4篇】:元组魔法
    Python学习【第3篇】:列表魔法
    Python学习【第2篇】:基本数据类型(详解)
    pycharm设置头文件模板(for mac)
    pycharm创建文件夹以及查看源文件存放位置(FOR MAC)
  • 原文地址:https://www.cnblogs.com/fredshare/p/3059737.html
Copyright © 2011-2022 走看看