為什麼放棄jQuery
一. 前言
首先,直接操作dom的程式設計方式已經成為過去,資料驅動才是正途!
其次,不一定非要捨棄jQuery,只是可以,選擇權在自己手上!
下面只是就事論事
二. 落幕
2018年7月 全球最大的同性交友社群(Github)被微軟收購後的 52 天,改版並放棄了 jQuery 。這一舉動讓我等搬運工陷入了沉思。
三.Why?
隨著ECMAScript標準的更新,原生js已經可代替jQuery,給我babel一個面子,不要再說相容不支援的話!
下面舉兩個比較常用的方面來說明:
- jQuery Api可以使用原生輕鬆實現
- 使用 fetch 來代替 ajax;
Fetch API 是基於 Promise 設計,更符合目前的非同步解決方案。什麼是目前的非同步解決方案?翻看上一篇async & await
四.具體實現對比(部分)
1.選擇器
//jq
$("#a .b");
//Native
document.querySelectorAll("#a .b");
2.插入
//jq
$(selector).append(html);
//prepend
//before
//after
//Native
document.querySelectorAll(selector).insertAdjacentHTML("beforeend", html);
//beforebegin 開始標籤之前 before
//afterbegin 開始標籤之後 prepend
//beforeend 結束標籤之前 append
//afterbegin 結束標籤之後 after
3.類操作
//jq
$(selector).addClass(className);
//hasClass
//removeClass
//toggleClass
//Native
document.querySelectorAll(selector).classList.add(className, className, className...);
//contains(className) 檢測是否存在
//removeClass(className, className, className...) 刪除
//toggle(className, true|false) 切換
4.ajax
//jq
$.ajax({
//.................
});
//Native
(async () => {
try{
const res = await req(url, {headers: {Accept: "text/html"}});
if(......){
.......
}
} catch {
}
}());
function req(url, data) { //自己封裝,僅供參考
let sendurl = url;
let setting = {
method: data.type ? data.type : "get",
headers: new Headers({
"Accept": "application/json, text/javascript, */*; q=0.01",
"Pragma": "no-cache",
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
"X-Requested-With": "XMLHttpRequest"
}),
credentials: "include"
};
if(data.headers){
const headers = setting.headers;
for(let attr in data.headers){
if(headers.has(attr)){
headers.set(attr, data.headers[attr]);
} else {
headers.append(attr, data.headers[attr]);
}
}
}
if (setting.method == "post") {
setting.body = data.param ? paramData(data.param) : "";
} else {
sendurl = sendurl + (data.param ? "?" + paramData(data.param) : "");
}
return fetch(sendurl, setting).then((response) => {
if (response.status >= 200 && response.status < 300) {
return response;
} else {
throw new Error(response.statusText);
}
}).then((response) => {
const accept = setting.headers.get("accept");
if(accept.includes("/json")){
return response.json();
} else if(accept.includes("/html")){
return response.text();
}
});
}
五.原生實現類jQuery的庫
上手才是關鍵,下面實現了部分jQuery的Api(程式碼構建編譯部分省略),可能功能有所差異,但是就是這個味兒~
<!DOCTYPE html>
<html lang="en">
<title>test</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<head>
</head>
<body>
<div class="test" actid="111"></div>
</body>
<script>
class xy {
constructor(selector){
this.dom = document.querySelectorAll(selector);
this.length = document.querySelectorAll(selector).length;
}
eq(index){
this.dom = [this.dom[index]];
return this;
}
attr(name){
return this.dom[0].getAttribute(name);
}
children(index){
let childrenList = [];
for(let i = 0;i < this.dom.length;i++){
childrenList.push(this.dom[i].children);
}
let arr = [];
for(let i = 0;i < childrenList.length;i++){
arr.push(index != undefined ? childrenList[i][index] : childrenList[i]);
}
return arr.length > 1 ? arr : arr[0];
}
append(htmlStr){
// for(let i = 0;i < this.dom.length;i++){
// this.dom[i].insertAdjacentHTML("beforeend", htmlStr);
// }
this.circulationFun("dom.insertAdjacentHTML('beforeend', '" + htmlStr + "')");
}
html(htmlStr){
this.circulationFun("dom.innerHTML = '" + htmlStr.replace(/\s*/g,"") + "'");
}
remove(){
this.circulationFun("dom.parentNode.removeChild(dom)");
}
addClass(className){
this.classFun("add", className);
}
removeClass(className){
this.classFun("remove", className);
}
toggleClass(className){
this.circulationFun("dom.classList.toggle('" + className + "')");
}
classFun(order, className){
const classArr = className.split(" ");
let code = "dom.classList." + order + "(";
for(let i = 0;i < classArr.length;i++){
code += "'" + classArr[i] + "',";
}
code = code.substr(0, code.length - 1);
code += ")";
this.circulationFun(code);
}
circulationFun(code){
for(let i = 0;i < this.dom.length;i++){
new Function("dom", "i", code)(this.dom[i], i);
}
}
//你可以不停的去擴充套件
}
function $xy(selector){
return new xy(selector);
}
$xy(".test").attr("actid");
//output 111
</script>
相關文章
- 為什麼都放棄了LangChain?LangChain
- GitHub:我們為什麼會棄用jQuery?GithubjQuery
- 為什麼要在2021年放棄ExpressJS -DEVExpressJSdev
- 放棄jQuery, 使用原生jsjQueryJS
- 我為什麼放棄MySQL?選擇了MongoDBMySqlMongoDB
- 為什麼放棄精準測試平臺?
- 為什麼 Ubuntu 放棄 Unity?創始人如是說UbuntuUnity
- 為什麼 husky 放棄了傳統的 JS 配置JS
- 為什麼JavaWeb放棄jsp,去做前後端分離JavaWebJS後端
- [譯] 為什麼我放棄了 React 而轉向 Vue。ReactVue
- 為什麼華為、百度紛紛選擇OKR,放棄KPI?OKRKPI
- 為什麼5000+企業放棄Sonatype,選擇JFrog Artifactory
- 為什麼阿里的dubbo註冊中心要放棄zookeeper, 而用Nacos?阿里
- 為什麼我們放棄了 Vue?Vue 和 React 深度對比VueReact
- 企業為什麼要放棄區塊鏈,轉向雲端?區塊鏈
- 為什麼很多SpringBoot開發者放棄了Tomcat,選擇了UndertowSpring BootTomcat
- 放棄遊戲業務 迪士尼的神奇魔法為什麼不靈了?遊戲
- 為什麼品牌電商紛紛放棄爬蟲而轉向RPA?爬蟲
- 為什麼我們放棄使用Kafka Streams實現全部的事件溯源?-MateuszKafka事件
- 為什麼你應該放棄React老的Context API用新的Context APIReactContextAPI
- 我為什麼在最後一刻放棄了近視眼手術
- 起薪12500的Python,為什麼有些人自學幾天就放棄了?Python
- 為什麼我們放棄 Python 而選擇 Go?(getstream.io 的架構變遷)PythonGo架構
- 蘋果放棄英特爾晶片,為什麼會打擊美國計算機產業?蘋果晶片計算機產業
- 為什麼越來越少的人用jQueryjQuery
- 為什麼開發者應該摒棄敏捷?敏捷
- K8s 為什麼要棄用 Docker?K8SDocker
- 為什麼那麼多自學Python的後來都放棄了,總結起來就這些原因Python
- 為什麼我在2019年仍在使用jQuery?jQuery
- 為什麼我要放棄javaScript資料結構與演算法(第二章)——陣列JavaScript資料結構演算法陣列
- 為什麼大家現在放棄使用Excel,而選擇第三方報表工具呢?Excel
- jQuery是什麼jQuery
- 【Web】JavaWeb專案為什麼我們要放棄jsp?為什麼要前後端解耦?為什麼要前後端分離?2.0版,為分散式架構打基礎。 - CSDN部落格WebJavaJS後端解耦分散式架構
- [譯] 2019 年了,為什麼我還在用 jQuery?jQuery
- 公眾號為什麼被很多企業放棄了?小程式是公眾號的下一個出口?
- Kubernetes為什麼將會棄用Docker支援? - Dixie3FlatlineDocker
- 我放棄了MVP - mironovMVP
- jQuery是什麼?如何使用?jQuery