type
console.log($.type('123'));
console.log($.type(123));
console.log($.type(true));
console.log($.type(function () { }));
console.log($.type({}));
console.log($.type([]));
console.log($.type(undefined));
console.log($.type(null));
console.log($.type(new Number()));
console.log($.type(NaN));
复制代码
trim
var target = ' 1 2 3 ';
console.log($.trim(target));
复制代码
proxy
- 参数:
- function:目标函数
- target: 目标对象
- 做用:
- 改变目标函数里的this指向目标对象
- 说明:
- 与js原生bind的方法相似
#list {
width: 100px;
height: 100px;
background-color: orange;
}
复制代码
<div id="list"></div>
复制代码
var list = {
init: function () {
this.mes = '123';
this.dom = document.getElementById('list');
this.bindEvent();
},
bindEvent: function () {
this.dom.onclick = $.proxy(this.show, this);
},
show: function () {
console.log(this.producesMes(this.mes));
},
producesMes: function (mes) {
return mes + '123';
}
};
list.init();
复制代码
noConflict
- 做用:
- 防止冲突
- 说明:
- 经过修改$名称来防止变量名冲突
#list {
width: 100px;
height: 100px;
background-color: orange;
}
复制代码
<div id="list"></div>
复制代码
var $Z = $.noConflict();
$Z('#list').css('background', 'red');
复制代码
each
- 参数:
- array: 遍历数组
- function:目标函数:包含index, element
- 做用:
- 遍历数组
- 能够遍历数组,对象,伪数组
var arr = [
{ name: 1, age: 18 },
{ name: 2, age: 20 },
];
$.each(arr, function (index, ele) {
console.log(ele.name, ele.age);
});
var obj = {
a: 1,
b: 2
};
$.each(obj, function (index, ele) {
console.log(index, ele);
});
function fn() {
$.each(arguments, function (index, ele) {
console.log(index, ele);
});
}
fn(1, 2);
复制代码
map
- 参数:
- array: 遍历数组
- function:目标函数:包含element, index
- 做用:
- 遍历操做数组,返回操做后的新数组
- 能够遍历数组,对象,伪数组
var arr = [1, 2, 3, 4];
var newArr = $.map(arr, function (ele, index) {
return ele ** index;
});
console.log(newArr);
var obj = {
a: 1,
b: 2
};
var arr = [1, 2, 3, 4];
var newArr = $.map(obj, function (ele, index) {
return ele * 2;
});
console.log(newArr);
function fn() {
var newArr = $.map(arguments, function (ele, index) {
return ele ** index;
});
console.log(newArr);
}
fn(1, 2, 3, 4);
复制代码
parseJson
var jsonStr = '{"name": "zhangl", "age": 18, "gender": "MAN"}';
var jsonObj = $.parseJSON(jsonStr);
console.log(jsonObj);
复制代码
makeArray
- 参数:
- 做用:
- 将伪数组转换为数组
- 说明:
- 当一个参数时,将伪数组转换为数组
- 当两个参数时,将前面的值,插入到后面的对象里,至关于合并的做用
function fn() {
var newArr = $.makeArray(arguments);
console.log(newArr);
};
fn(1, 2, 3, 4)
var obj = {
a: 1,
b: 2,
length: 2
}
var newObj = $.makeArray([1, 2], obj);
console.log(newObj);
var newArr = $.makeArray('a', [1, 2]);
console.log(newArr);
复制代码
extend
- 做用:
- 插件扩展(工具方法)
- 浅层克隆
- 深层克隆
- 说明:
- 扩展插件,参数为一个对象
- 浅层克隆,参数为多个对象,将后面对象的key-value复制到最前面一个对象中,出现相同的key后面的覆盖前面的
- 深层克隆,第一个参数为true,其他参数为对象, 将后面对象的key-value复制到最前面一个对象中,出现相同的key后面的覆盖前面的
$.extend({
getRandom: function (start, end) {
return Math.random() * (end - start) + start;
}
});
console.log($.getRandom(5, 10));
var obj1 = {
name: '张三',
age: 18,
sex: 'MAN'
};
var obj2 = {
name: '李四',
age: 19
};
var obj3 = {
name: '王五',
age: 20,
son: {
name: '王五的孩子',
age: 1
}
};
$.extend(obj1, obj2, obj3);
console.log(obj1);
obj1.son.name = '张三的孩子';
console.log(obj3.son.name);
$.extend(true, obj1, obj2, obj3);
console.log(obj1);
obj1.son.name = '张三的孩子';
console.log(obj3.son.name);
复制代码
fn.extend
- 做用:
- 插件扩展(实例方法)
- 浅层克隆
- 深层克隆
- 说明:
- 扩展插件,参数为一个对象
- 浅层克隆,参数为多个对象,将后面对象的key-value复制到最前面一个对象中,出现相同的key后面的覆盖前面的
- 深层克隆,第一个参数为true,其他参数为对象, 将后面对象的key-value复制到最前面一个对象中,出现相同的key后面的覆盖前面的
<div id="demo" style="width: 100px; height: 100px; background: orange; position: absolute">
</div>
复制代码
$.fn.extend({
drag: function (e) {
var disX,
disY,
self = this;
$(this).on('mousedown', function (e) {
disX = e.pageX - $(this).offset().left;
disY = e.pageY - $(this).offset().top;
$(document).on('mousemove', function (e) {
$(self).css({ left: e.pageX - disX, top: e.pageY - disY });
});
$(document).on('mouseup', function () {
$(this).off('mousemove').off('mouseup');
});
});
return this;
}
});
$('#demo').drag();
var obj1 = {
name: '张三',
age: 18,
sex: 'MAN'
};
var obj2 = {
name: '李四',
age: 19
};
var obj3 = {
name: '王五',
age: 20,
son: {
name: '王五的孩子',
age: 1
}
};
$.fn.extend(obj1, obj2, obj3);
console.log(obj1);
obj1.son.name = '张三的孩子';
console.log(obj3.son.name);
$.fn.extend(true, obj1, obj2, obj3);
console.log(obj1);
obj1.son.name = '张三的孩子';
console.log(obj3.son.name);
复制代码
ajax
- 参数:
- object: 对象
- url: 请求资源路径
- type: 请求方式 'get', 'post'
- data: 请求参数
- dataType: 请求参数类型 jsonp
- async: 是否异步
- success: 请求成功回调
- error: 请求失败回调
- complete: 请求完成回调
- context: 修改执行上下文对象
- 做用:
- 发送网络请求,接收请求数据
<div class="wrapper"></div>
复制代码
$.ajax({
url: 'https://easy-mock.com/mock/5c0b4a876162b83fe0a50cb9/person',
type: 'GET',
data: {
name: 'zhangl'
},
success: function (res) {
console.log(res);
console.log(this);
$.each(res.data, function (index, ele) {
console.log(ele);
});
},
error: function (e) {
console.log(e.status, e.statusText);
},
complete: function () {
console.log('请求完成');
},
context: $('.wrapper')
});
复制代码
Callbakcs
- 参数:
- 做用:
- 管理多个回调函数
- 说明:
- 返回一个callback对象,具备add(添加)和fire(执行)两个API
- 参数为once只执行一次fire
- 参数为memory只要执行过fire,那么后面再add的回调函数,直接执行
- 参数为unique,当添加多个相同的回调函数,默认去除重复的回调函数
- 参数为stopOnFalse,当碰到返回值为false, 那么后面的回调函数都不会执行
var cb = $.Callbacks();
function firstTask(x, y) {
console.log('firstTask', x, y);
}
function secondTask(x, y) {
console.log('secondTask', x, y);
}
cb.add(firstTask, secondTask);
cb.fire(10, 20);
cb.fire(10, 20);
function thirdTask(x, y) {
console.log('thirdTask', x, y);
}
cb.add(thirdTask);
cb.fire(10, 20);
var cb = $.Callbacks('once');
function firstTask(x, y) {
console.log('firstTask', x, y);
}
function secondTask(x, y) {
console.log('secondTask', x, y);
}
cb.add(firstTask, secondTask);
cb.fire(10, 20);
cb.fire(10, 20);
var cb = $.Callbacks('memory');
function firstTask(x, y) {
console.log('firstTask', x, y);
}
function secondTask(x, y) {
console.log('secondTask', x, y);
}
cb.add(firstTask, secondTask);
cb.fire(10, 20);
function thirdTask(x, y) {
console.log('thirdTask', x, y);
}
cb.add(thirdTask);
var cb = $.Callbacks('unique');
function firstTask(x, y) {
console.log('firstTask', x, y);
}
function secondTask(x, y) {
console.log('secondTask', x, y);
}
cb.add(firstTask, secondTask);
cb.add(firstTask, secondTask);
cb.fire(10, 20);
var cb = $.Callbacks('stopOnFalse');
function firstTask(x, y) {
console.log('firstTask', x, y);
}
function secondTask(x, y) {
console.log('secondTask', x, y);
return false;
}
function thirdTask(x, y) {
console.log('thirdTask', x, y);
}
cb.add(firstTask, secondTask, thirdTask);
cb.fire(10, 20);
复制代码
Deferred
- 做用:
- 异步处理事件
- ajax回调地狱解决方案
- 说明:
- Deferred对象具有注册事件和执行事件的功能
- 注册事件API done:成功状态 fail:失败状态 progress:等待状态
- 触发事件API resolve:成功状态; reject:失败状态; notify:等待状态
- Deferred对象的promise方法返回只具有注册功能的Deferred对象
- 若是触发了resolve或reject,那么其余状态注册的函数不会再执行,若是触发的是notify,会随机触发resolve,reject其中的一个
function getScore() {
var df = $.Deferred();
setInterval(function () {
var score = Math.random() * 100;
if (score > 60) {
df.resolve(score);
} else if (score < 50) {
df.reject(score);
} else {
df.notify(score)
}
}, 1500);
return df.promise()
}
var df = getScore();
df.done(function (score) {
console.log('成功', score);
});
df.fail(function (score) {
console.log('失败', score);
});
df.progress(function (score) {
console.log('等待', score);
});
复制代码
then
- 参数
- function: resolve
- function: reject
- function: progress
- 做用:
- 简化Deferred的注册步骤
- 便于链式调用, 结构清晰
function getScore() {
var df = $.Deferred();
setInterval(function () {
var score = Math.random() * 100;
if (score > 60) {
df.resolve(score);
} else if (score < 50) {
df.reject(score);
} else {
df.notify(score)
}
}, 1500);
return df.promise()
}
var df = getScore();
df.then(function (score) {
console.log('成功', score);
var innerDf = $.Deferred();
setTimeout(function () {
innerDf.resolve('成功');
}, 1000);
return innerDf.promise();
}, function (score) {
console.log('失败', score);
var innerDf = $.Deferred();
setTimeout(function () {
innerDf.reject('失败');
}, 1000);
return innerDf.promise();
}, function (score) {
console.log('等待', score);
var innerDf = $.Deferred();
setTimeout(function () {
innerDf.progress('等待');
}, 1000);
return innerDf.promise();
}).then(function (res) {
console.log('第二次resolve' + res);
}, function (res) {
console.log('第二次reject' + res);
}, function (res) {
console.log('第二次notify' + res);
});
复制代码