構建一個類jq的函式庫

發表於2016-08-07

jqfree

雖然團隊裡用上了vue,但是某些情況下可能仍然需要操作DOM,或者是需要一些諸如變數型別判斷、時間解析函式、url解析函式、浮點數四捨五入小數位和獲取隨機位數字符串的輔助函式。而本篇就是教你怎麼構建這樣一個山寨版的庫,只要400行程式碼,你就能體驗寫一個庫函式暢快的感覺!

jqfree core

我們需要一個包裝著DOM Elements的偽陣列,此偽陣列物件使用原型鏈去掛載共享的DOM處理方法,原理如下圖。

23881940

extend

jqfree中的extend函式參照了prototype.js的實現方式,$.extend和$.fn.extend功能相同,也都是通過淺拷貝的方式,把第二個引數上的物件擴充套件新增到第二個引數的物件上,如果沒有指定第二個引數,則會把第一個引數新增到this上。需要給DOM元素新增方法的話,使用$.fn.extend如$.fn.append,而需要給全域性$物件新增擴充套件的話,使用$.extend,如$.ajax。

traverse

遍歷jqfree物件中的DOM Elements。實際上是遍歷了$.fn.init {0: body, length: 1, selector: "body"}這樣的一個偽陣列中的類似陣列的那一部分。

接受一個回撥函式,其第一個引數為dom元素,第二個引數為序號,呼叫程式碼如

DOM processor。

文件操作。新增了append,prepend,remove,empty的方法,功用同原版jquery。因為生成的$.fn.init是個包含DOM的偽陣列,所以操作中就需要遍歷這個陣列做append操作,目的是為了讓選中的所有DOM元素都append一遍。appendChild為DOM level2方法,從IE6開始就支援。

呼叫程式碼如

css

新增了css的方法,功用同原版jquery。現將css規則轉為駝峰式,然後利用style屬性插入,如background-color: #FFF,會被當作dom.style.backgroundColor = '#FFF'這樣的插入。

支援兩種寫法,引數1和引數2可以互為鍵值對,或者引數1為一個物件,另外這裡只第一個dom元素的css規則生效。呼叫程式碼如

DOM filter

新增了dom過濾的幾個函式,如children、parent、siblings。返回出去的DOM物件會再次被$.fn.init物件包裝。

只對第一個DOM元素生效,呼叫程式碼如下:

attributes

獲取屬性,實現了attr,removeAttr,addClass,hasClass,removeClass,data,html這幾個api,功能和jq相似。 拿addClass舉例來說,classList為H5的API,不支援IE9及以下。所有被匹配的dom元素都會被addClass處理。

呼叫方式如下:

event

事件操作。繫結事件使用on,取消繫結事件使用off,觸發事件使用trigger。拿on舉例,直接使用了addEventListener監聽,不支援IE8及以下。需要支援IE8級以下的話,請使用attachEvent相容。

第一個引數為事件名,第二個引數為回撥,呼叫程式碼如下:

effect

其他效果,鑑於動畫用css3會更直觀,所以這裡只實現了show和hide兩個方法。所有匹配的DOM元素都會被影響,這裡只是簡單設定了display屬性為block或者none,有待改進。

呼叫程式碼如下:

ajax

抽離jsonp,$.jsonp獨立於$.ajax,畢竟jsonp的原理和ajax完全沒有關係,如果使用$.ajax的話有些誤導別人。 $.ajax和$.jsonp方法最後都會返回一個Promise物件,此Promise參照了這裡的方案。

$.ajax只接受一個物件作為引數,並且支援使用promise的寫法,呼叫如下

注意,本地沒法測試ajax函式,如果有需要請在此專案目錄下執行node server.js,接著去開啟test.html檔案的關於ajax的註釋,再去localhost:3000/test.html就能看到測試ajax的內容。

將增刪改查cookie操作都用一個函式搞定

呼叫程式碼如下:

utils

新增了變數型別判斷、時間解析函式、url解析函式、浮點數四捨五入小數位和獲取隨機位數字符串的輔助函式。

呼叫如下:

說明

jqfree純粹研究用,不考慮諸多相容。算上註釋也就只有400行,可以簡單研究一下其程式碼是如何構建的。從jq畢業一陣子了,總得寫點東西紀念下老夥計。github地址在這裡,有啟發的話請不吝給我的github點贊。

參考

相關文章