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);
});
複製代碼