1. 程式人生 > >單頁應用中更優雅的操作dom

單頁應用中更優雅的操作dom

前言

以前的專案是jquery獨行天下,但是隨著單頁應用的流行,很多公司放棄了jquery的使用,主要因為專案中dom操作較少,一般都是資料改變dom,但是假如專案中難免的操作一些dom的時候,我們可以完全用js的一些寫法,完全沒有必要小小的操作來引進一個那麼龐大的jquery。 但是話說回來了,jquery用習慣了,$(),這種選擇器已經深入人心。

雖然谷歌瀏覽器已經支援$$("body")的寫法,$$ 目前用的人畢竟很少,後期維護等也不是很方便。

$$('a') 等價於 document.querySelectorAll(“a”)

document.querySelectorAll自定義縮寫

為啥我們不把 document.querySelectorAll,直接定義為$ 呢?

這樣就可以像寫jquey一樣選擇dom了?

因此我們如下寫:

var $ = document.querySelectorAll;
$("body")

但是報錯了!

VM343:2 Uncaught TypeError: Illegal invocation
    at <anonymous>:2:1

想了一下,原因如下:

querySelectorAll 所需的執行上下文必需是 document,而我們賦值到 $ 呼叫後上下文變成了全域性 window。

因此,我們手動繫結一下:

var $ = document.querySelectorAll.bind(document);

這次對了

var $ = document.querySelectorAll.bind(document);
$("body")
NodeList [body.pace-done]

但是有個問題,$("body")方法返回的要麼是單個 Node 節點,要麼是 NodeList 而 NodeLis 是類陣列的物件,但並不是真正的陣列,所以拿到之後不能直接使用 map,forEach 等方法。

因此:

Array.prototype.map.call($('button'),function(element,index){
    element.onclick = function(){
    }
})

或者

[].slice.call($('button')


Array.from($('button')

類陣列轉為陣列的方式轉換一下!