現代瀏覽器中內建的幾個可以等效替代jQuery的功能
jQuery的體積在不斷的增大。新功能要不斷增加,這是必然結果。雖然從版本1.8.3開始的瘦身效果明顯,但不可否認的是,對於移動手機端的網頁開發,它仍然是不可接受的。當然,jQuery不是鐵板一塊,你可以對它進行定製,只打包進你想要的元件,但其中的一些用來相容老式瀏覽器的程式碼你無法去除。
就我的個人習慣來說,不管開發什麼專案,即使是一個很簡單的demo,我做的第一件事就是引入jQuery,這樣做主要是想使用它提供的DOM選擇器功能。對於一些像IE6/IE7這樣的老式瀏覽器,這種做法是顯而易見的,但是,如今現代瀏覽器裡已經內建了完整的DOM選擇器功能,能讓你使用原生的瀏覽器提供的方法來實現jQuery的功能。
document.queryselector
這裡說的現代瀏覽器是指火狐、谷歌、Opera、Safri等新生代瀏覽器,如果是IE,你需要至少是IE8或以上。你可以簡單的將document.querySelector()函式對映為$,它能返回在DOM中找到的第一個匹配選擇條件的元素。任何的CSS選擇符都可以作為它的引數。
注意:IE 8只支援 CSS2.1標準的選擇器
<div class="container"> <ul> <li id="pink">Pink</li> <li id="salmon">Salmon</li> <li id="blue">Blue</li> <li id="green">Green</li> <li id="red">Red</li> </ul> </div> <script> // 建立全域性的 '$' 變數 window.$ = function(selector) { return document.querySelector(selector); }; (function() { // 通過id查詢item1,將它的背景顏色修改為淺紅 var item = $("#salmon").style.backgroundColor="salmon"; console.log(item); }()); </script>
你需要使用原生的“style”方法,而且這裡不能使用jQuery裡的鏈式呼叫。console.log()輸出的將會是backgroundColor方法返回的“salmon”。
原生DOM節點有時候會比封裝後的jQuery物件更好用。例如,如果你想修改一個圖片的src屬性,比較一下下面使用jQuery的做法和直接使用DOM節點的做法。
// jQuery方式 $("#picture").attr("src", "http://placekitten.com/200/200"); //使用將querySelector對映為$的原生js方式 $("#picture").src = "http://placekitten.com/200/200";
DOM物件能讓你直接訪問圖片的src屬性,相反,所有的jQuery物件都需要你通過attr函式來操作。
document.querySelector方法只返回一個元素。如果你的選擇目標是一堆元素,它只會返回符合條件的第一個節點。要想返回所有節點,你需要使用document.querySelectorAll方法。
document.queryselectorall
一個很巧妙的做法是將querySelector對映為$,而將querySelectorAll函式對映為$$。但它返回的是一個節點列表,不如jQuery裡返回的Array格式好用,我們可以使用Array.prototype.slice.call(nodeList)方法加工一下,讓它更方便。
<div class="container"> <ul> <li id="pink">Pink</li> <li id="salmon">Salmon</li> <li id="blue">Blue</li> <li id="green">Green</li> <li id="red">Red</li> </ul> </div> <script> window.$ = function(selector) { return document.querySelector(selector); }; window.$$ = function(selector) { var items = {}, results = [], length = 0, i = 0; // 注意,IE8不支援這種做法 results = Array.prototype.slice.call(document.querySelectorAll(selector)); length = results.length; // add the results to the items object for ( ; i < length; ) { items[i] = results[i]; i++; } // 新增一些額外的屬性,讓它更像一個Array items.length = length; items.splice = [].splice(); // 新增 'each' 方法 items.each = function(callback) { var i = 0; for ( ; i < length; ) { callback.call(items[i]); i++; } } return items; }; (function() { // 查詢green項,修改字型大小 $("#green").style.fontSize = "2em"; // 通過id查詢,修改背景色 $$("li").each(function() { this.style.backgroundColor = this.id; }); }()); </script>
注意,IE8是不支援將一個nodeList轉換為Array的。
classList
使用jQuery對CSS類操作十分方便,幸運的是,現代瀏覽器裡也內建了一下方法能夠很方便的操作它們,主要用到了classList物件。下面是一些基本操作兩種方式的對比。
window.$ = function(selector) { return document.querySelector(selector); }; //----增加CSS類------ /* jQuery */ $(".main-content").addClass("someClass"); /* 等效內建方法 */ $(".main-content").classList.add("someClass"); //----刪除一個CSS類----- /* jQuery */ $(".main-content").removeClass("someClass"); /* 等效內建方法 */ $(".main-content").classList.remove("someClass"); //----判斷是否存在一個CSS類--- /* jQuery */ if($(".main-content").hasClass("someClass")) /* 等效內建方法 */ if($(".main-content").classList.contains("someClass"))
相對於jQuery提供大量豐富的方法,上面說的這幾個現代瀏覽器裡內建的功能顯得很簡單,但如果專案中的要求不高,這些替代方法能大大的減少你的應用依賴。
最後要提醒的是,這些內建方法在不同的瀏覽器和不同的版本中支援程度不一樣,下面是它們的支援程度參考表。
附圖1:各種瀏覽器對querySelector/querySelectorAll的相容支援
附圖1:各種瀏覽器對classlist的相容支援
參考資料:
-
5 Things You Should Stop Doing With jQuery -
Native equivalents of jQuery functions -
http://caniuse.com
相關文章
- 可以替代basemap的幾個工具
- [譯]從內部瞭解現代瀏覽器(2)瀏覽器
- [譯]從內部瞭解現代瀏覽器(3)瀏覽器
- [譯]從內部瞭解現代瀏覽器(1)瀏覽器
- 探一探現代瀏覽器的內部機制(一)瀏覽器
- 【譯】瀏覽器如何工作:在現代web瀏覽器場景的之下瀏覽器Web
- 區分微信內建瀏覽器瀏覽器
- javascript如何判斷內建的微信瀏覽器JavaScript瀏覽器
- 替代Edge瀏覽器?微軟開發新的瀏覽器:採用Chrome核心瀏覽器微軟Chrome
- 現代瀏覽器內部工作原理(附詳細流程圖)瀏覽器流程圖
- 幾種可以對瀏覽器進行核心攻擊的方法瀏覽器
- Unity3d內建瀏覽器Unity3D瀏覽器
- Brow.sh:現代的基於文字的瀏覽器瀏覽器
- 如何正確解除安裝Chrome瀏覽器及其元件Keystone?有哪些瀏覽器可以替代Chrome?Chrome瀏覽器元件
- 深入現代瀏覽器的HTTP快取機制瀏覽器HTTP快取
- 實現微信內建瀏覽器線上支付簡單介紹瀏覽器
- js判斷是否在微信內建瀏覽器中開啟JS瀏覽器
- 現代瀏覽器效能優化-JS篇瀏覽器優化JS
- 瀏覽器的全屏功能小結瀏覽器
- [BUG反饋]IE瀏覽器,百度瀏覽器,搜狗瀏覽器批量操作功能都不相容!!!!傲遊、火狐、谷歌瀏覽器可以瀏覽器谷歌
- 瀏覽器可以有多快?瀏覽器
- [譯]現代瀏覽器是如何提升效能的:網路層瀏覽器
- QQ內建瀏覽器選單欄設定瀏覽器
- 如何判斷微信內建瀏覽器(JS & PHP)瀏覽器JSPHP
- 使用 Finder預覽功能,讓你可以快速瀏覽多個檔案!
- 前端實現很哇塞的瀏覽器端掃碼功能?前端瀏覽器
- 精讀《深入瞭解現代瀏覽器四》瀏覽器
- 現代瀏覽器探祕(part3):渲染瀏覽器
- 精讀《深入瞭解現代瀏覽器三》瀏覽器
- 精讀《深入瞭解現代瀏覽器二》瀏覽器
- 精讀《深入瞭解現代瀏覽器一》瀏覽器
- [譯] 現代瀏覽器內部揭祕(第二部分)瀏覽器
- 譯—現代瀏覽器內部原理(第一部分)瀏覽器
- [譯] 現代瀏覽器內部揭祕(第四部分)瀏覽器
- [譯] 現代瀏覽器內部揭祕(第三部分)瀏覽器
- 瀏覽器中的Event Loop瀏覽器OOP
- 關於現代瀏覽器的 back-and-forward 快取機制瀏覽器Forward快取
- 當前主流瀏覽器核心有哪幾個瀏覽器