Introduction
正如jQuery所宣稱的一樣,Write Less, Do More。很多時候我們喜歡用它來解決問題。但增加一個庫必然意味着更大的網絡負擔,意味着更高的頁面初始載入時間。並且,現在與當初已經有了很大不同,jQuery是伴隨着IE6出來的,當時,jQuery在跨瀏覽器開發上有不可替代的作用。但今天,伴隨ES5的廣泛被支持以及各個瀏覽器本身的完善,我們可以考慮適當的丟掉它,改善性能。
需要注意的是,並不是說jQuery是不可取的,在某些場合,用它是更合適的,需要我們自己判斷。
Listening for Document Ready
我們經常用到$( document ).ready()
或者它的簡寫 $()
,用來傳入當所有dom准備完畢后,執行邏輯的相關回調。原生js可以這么寫:
document.addEventListener('DOMContentLoaded', function () {
// dom 已經准備好被操作了
});
Selecting elements
我們常常依賴於jQuery的選擇器,而現在,所有的瀏覽器基本都支持了querySelector
與 querySelectorAll
,這里是MDN鏈接
var lochNess = document.querySelector(".monsters");
console.log("It's from Scotland - " + lochNess.textContent);
var scary = document.querySelectorAll(".monsters");
for (var i = 0; i < scary.length; i++) {
console.log(scary[i].innerHTML);
}
Attaching and removing event listeners
偵聽事件是web開發中再重要不過的一環。曾經IE獨樹一幟,與其它瀏覽器提供的API不一致,導致需要用jQuery來快速開發,現在,所有的瀏覽器都提供了addEventListener:
var btn = document.querySelectorAll("button"),
btn[0].addEventListener("click", function () {
list.addEventListener("mouseover", enlarge);
});
btn[1].addEventListener("click", function () {
list.removeEventListener("mouseover", enlarge);
});
Manipulating classes and attributes
曾經,不使用jQuery來處理class是一件很麻煩的事情,而現在,由於classList的存在(這里是MDB鏈接)我們可以快捷的解決這一類問題,另外,如果需要操作attribute,可以使用setAttribute(同樣是MDN鏈接)
var btn = document.querySelectorAll("button"),
div = document.querySelector("#myDiv");
btn[0].addEventListener("click", function () {
//可以獲取任意的屬性
console.log(div.id);
});
// Element.classList存放了所有當前元素的class
var classes = div.classList;
btn[1].addEventListener("click", function () {
console.log(classes);
});
btn[2].addEventListener("click", function () {
//可以添加,刪除
classes.add("red");
});
btn[3].addEventListener("click", function () {
//也可以翻轉
classes.toggle("hidden");
});
Getting and setting element content
jQuery提供了text() html()用以操作元素的內容,我們可以使用原生的textContent與innerHTML屬性代替它們。
var myText = document.querySelector("#myParagraph"),
btn = document.querySelectorAll("button");
// 獲取
var myContent = myText.textContent;
console.log("textContent: " + myContent);
// 改變
btn[0].addEventListener('click', function () {
myText.textContent = " Koalas are the best animals ";
});
var myHtml = myText.innerHTML;
console.log("innerHTML: " + myHtml);
btn[1].addEventListener('click', function () {
myText.innerHTML = "<button> Penguins are the best animals </button>";
});
Inserting and removing elements
原生的js可以這樣添加與刪除元素:
var lunch = document.querySelector("#lunch");
// 添加
var fries = document.createElement("div");
fries.innerHTML = '<li><h4> Fries </h4></li>';
lunch.appendChild(fries);
// 特定位置添加
var beef = document.querySelector("#Beef"),
topSlice = document.createElement("li"),
bottomSlice = document.createElement("li");
bottomSlice.innerHTML = topSlice.innerHTML = 'Cheese';
beef.parentNode.insertBefore(topSlice, beef);
beef.parentNode.insertBefore(bottomSlice, beef.nextSibling);
};
//刪除
var pickles = document.querySelector("#pickles");
if (pickles) {
pickles.parentNode.removeChild(pickles);
}
Walking the DOM tree
原生的js也可以遍歷DOM樹
var snakes = document.querySelector('#snakes'),
birds = document.querySelector('#birds');
snakes.addEventListener('click', function (e) {
console.log("Children: ");
var children = e.target.children;
for (var i = 0; i < children.length; i++) {
console.log(children[i].textContent);
}
});
birds.addEventListener('click', function (e) {
// 獲取最近的兄弟節點
var previous = e.target.previousElementSibling;
if (previous) {
console.log("Previous sibling: " + previous.textContent);
}
var next = e.target.nextElementSibling;
if (next) {
console.log("Next sibling: " + next.textContent);
}
//所有的兄弟們
Array.prototype.filter.call(e.target.parentNode.children, function (child) {
if (child !== e.target) {
console.log(child.textContent);
}
});
});
Looping over arrays
jQuery提供的 each與map已經可以被ES5的forEach與map替代
var ninjaTurtles = ["Donatello", "Leonardo", "Michelangelo", "Raphael"];
ninjaTurtles.forEach(function (entry) {
console.log(entry);
});
var lovesPizza = ninjaTurtles.map(function (entry) {
return entry.concat(" loves pizza!");
});
console.log(lovesPizza);
Animations
jQuery的動畫效果是非常強大的,在很多場合還是很難替代的,不過,由於CSS3,動畫可以轉到由CSS來實現。這部分就不給DEMO了。
AJAX
如果唯一使用jQuery的唯一理由,是它便捷的AJAX,那么,將jQuery替換成一個輕量的多的庫吧!比如reqwest,這個庫壓縮后不到10kB。
總結
盡全力使腳本變的更小,可以使用戶獲得更高的加載速度,以及更好的用戶體驗。但也要謹慎的做取舍,沒必要大量的造jQuery已經提供的輪子。
除了在編碼方面帶來性能優化,我們還可以借助工具達到同樣的效果。可以看一看博主的webpack方面的文章 😃