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(){} //类数组的判断(内部使用)
JQuery源码解读 JQ的一些扩展工具方法( 妙味讲堂 - 视频笔记 - 第四部分)
原文:https://www.cnblogs.com/SunlikeLWL/p/11620745.html