JQuery源码解读 JQ的一些扩展工具方法( 妙味讲堂 - 视频笔记 - 第四部分)

JQuery源码解读



JQ的一些扩展工具方法( 妙味讲堂 - 视频笔记 - 第四部分)


1、parseJSON()

JSON.parse()   // 解析字符串类型的JSON


2、eval()  //解析任何格式JSON,性能差




3、parseXML() // 字符串转DOM对象

// 源码实现
parseXML: function(data) {
  var xml, tmp;
  if (!data || typeof data !== "string") {
    return null;//只能解析字符串类型
  }
  try {
    tmp = new DOMParser(); //IE9+
    xml = tmp.parseFromString(data, "text/xml");
  }
  catch (e) {
    xml = null;
  }
  if (!xml || xml.getElementsBysTagName("parsererror").length) {
    jQuery.error("Invalid XML:" + data);
  }
  return xml;
}




4、globalEval()


function test() {
  var newVar = true
}

test();
console.log(newVar)  // 报错





function test1() {
  globalEval("var newVar = true");
}

console.log(newVar) //true



// 解析全局变量
globalEval: function(code) {
  var script, ; indirect = eval;
  code = jQuery.trim(code)

  if (code) {
    if (code.indexOf("use strict ") == 1) {
      script = document.createElement("script");
      script.text = code;
      document.head.appendChild(script).parentNode.removeChild(script);
    }
    else {
      indirecct(code);
    }
  }
}


6、camelCase() //转驼峰


7、nodeName();// 是否制定节点名


8、each()//遍历

var arr = [1, 2, 34, 34, 343,];

$.each(arr.function(i, value){
  console.log(value)
})



// 源码实现
each: function(obj, callback, args) {
  var value,
    i = 0,
    length = obj.length,
    isArray = isArraylike(obj);
  if (args) {
    if (isArray) {
      for (; i < length; i++) {
        value = callback.apply(obj[i], args);
        if (value === false) {
          breack;
        }
      }
    }
    else {
      if (isArray) {
        for (; i < length; i++) {
          value = callback.call(obj[i], i, obj[i]);
          if (value === false) {
            break;
          }
        }
      }
      else {
        for (i in obj) {
          value = callback.call(obj[i], i, obj[i]);
          if (value === false) {
            break;
          }
        }
      }
    }
  }
}



10、trim()//去掉前后空格

// 源码实现
trim: function(text) {
  return text === null ? "" : core_trim.call(text)
}




11、makeArray();//类数组,字符串,JSON转数组



makeArray: function(arr, results) {
  var ret = results || [];
  if (arr != null) {
    if (isArraylike(Object(arr))) {
      //merge 拼接数组
      jQuery.merge(ret, typeof arr === "string" ? [arr] : arr)
    }
    else {
      // 单个直接push
      core_push.call(ret, arr);
    }
  }
  return ret;
}

 
// 判断类数组
12、
function isArraylike(obj) {
  var length = obj.length;
  type = jQuery.type(obj);
  if (jQuery.isWindow(obj)) {
    reutrn false;
  }
  if (obj.nodeType === 1 && length) {
    return false;
  }
  return type === "array" || type !== "function" && (
    length === 0 || typeof length === "number" && length > 0 && (length - 1) in obj
  )
}

13、
// 拼接数组
merge:function(first,second){
   var f = first.length;
   var i = second.length;
   var j = 0;
   if(typeof l ==="number"){   //有length属性,判断是不是数组或类数组,JSON没长度
      for(;j<length;j++){
        first[i++] = second[j]
      }
   }
   else{
    //  second[j++] 下标是0,1,2,3的JSON
     while(second[j]!=undefined){ 
         first[i++] =  second[j++];
     }
   }
   first.length = i;
   return first;
}


// 存在key
inArray(key);//数组
indexOf(key);//字符串



14、
grep();// 过滤新数组

// 实例
var arr = [1,2,3,4];
$.grep(arr,function(n,i){
    return n>2;//大于2 的值作为新数组返回
},
 ture // 反向取值,小于2的值作为新数组返回
)


// 源码实现
grep:function(elems,callback,inv){
     var retVal,
     ret = [],
     i =0,
     length = elems.length,
     inv = !! inv;
     for(;i<length;i++){
       retVal = !!callback(elemes[i],i);
         if(inv === retVal){
             ret.push(elems[i])
         }
       }
     }
     return ret;
}

// 映射
map:function(elems,callback,arg){
    var value,
    i =0,
    length = elems.length,
    isArray = isArraylike(elemes),
    ret = [],

    if(isArray){
      for(;i<length;i++){
          value = callback(elems[i],i,arg);
          if(value!=null){
              ret[ret.length] = value;
          }
      }
    }
    else{
       for(i in elemes){
           value = callback(elems[i],i,args);
           if(value!=null){
               ret[ret.length] = value;
           }
       }
    }
    //  flatten any nested arrays 展平任何嵌套数组
    return core_concat.apply([],ret);
    
}



guid 1;// 全局唯一对象标识符



proxy();// 修改this指向


function show(n){
  console.log(n)
  console.log(this);
}

show(1);//this 指向window

$.proxy(show,document,1)();// this指向document
$.proxy(show,document)(1);// this指向document
// 两种传参



$.proxy(obj,"show")  ==  $.proxy(obj.show,obj);


// 源码实现

proxy:function(fn,context){
    var tmp,args,proxy;
     if(typeof context ==="stirng"){
       tmp = fn[contenxt];
       context = fn;
       fn = tmp;
     }
     if(!jQuery.isFunction(fn)){
         return undefined;
     }

    //  传参 从第三个开始合并参数
     args = core_slice.call(arguments,2);
     proxy = function(){
      //  core_slice.call(arguments)转数组
       return fn.apply(context||this,args.concat(core_slice.call(arguments)))
     }
    // guid 唯一标识
     proxy.guid = fn.guid||jQuery.guid++;
     return proxy;

}



access();//多功能值操作



$().css().attr();// get.set 操作


$("div").css("color");//获取

$("div").css("color","red");


// 对象
$("div").css({
  background: "red",
  color: "white"
})

// 源码实现

access:function(elems,fn,key,value,chainable,emptyGet,raw){
  var i=0,
  length = elems.length,
  bulk = key== null;
  // set many value
  if(jQuery.type(key)==="object"){
    chainable = true;
    for(i in key){
      jQuery.access(elems,fn,i,key[i],true,emptyGet,raw)
    }
  }
  else if(value!==undefined){
      chainable = true;
      if(!jQuery.isFunction(value)){ //不是函数
        raw = true;
      }
      if(bulk){   //  有bulk值 字符串
           if(raw){ 
                fn.call(elems,value);
                fn = null;
           }
           else{  // value 是函数的情况
             bulk = fn;
             fn = function(elem,key,value){
               return bulk.call(jQuery(elem),value);
             }
           }
      }
      if(fn){// 
        for(;i<length;i++){
            fn(elems[i],key,raw?value:value.call(elems[i],i,fn(elems[i],key)))
        }
      }
  }


  // set one value

}



// 获取当前时间,时间戳 new Date().getTime();
now(); // Date.now







$("div").width();//能获取display=none的元素,将display转为visibility: hidden;position: absolute;

$("div").get(0).offfsetWidth();//不能获取display=none的元素



// 节点属性替换,获取属性
swap:function(elem,options,callback,args){
  var ret,name,
  old = {};
  
  // 把新的属性值给到节点元素
  for(name in options){
      old[name] = elem.style[name];
      elem.style[name] = optons[name];
  }

  ret = callback.apply(elem,arg||[]);  //获取属性值

  
// 把旧的属性重新给节点元素设置回去
  for(name in options){
     elem.style[name] = old[name];
  }

  return ret;
}




jQuery.ready.promise = function(){} // 检测DOM测一步操作(内部使用)

function isArraylike(){}  //类数组的判断(内部使用)

  

posted @ 2019-10-03 20:53  SunLike阿理旺旺  阅读(187)  评论(0编辑  收藏  举报