自己動手做一個jQuery的API
1.jQuery的工作原理簡述
實現一個獲取節點的API,並且擁有添加類名的方法,添加文本的方法,獲取除自己的兄弟節點。我們需要了解jQuery的工作原理3:
jQuery本身並不是UI組件庫或其他的一般AJAX類庫,jQuery改變javascript編碼方式!
那麼它是如何實現它的聲明的呢?這裡,用以下的一段簡短的使用流程:
1、查找(創建)jQuery對象:$("selector");
2、調用jQuery對象的方法完成我們需要完成的工作:$("selector").doOurWork();
Query就是以這種可以說是最簡單的編碼邏輯來改變javascript編碼方式的。這兩個步驟是jQuery的編碼邏輯核心
2.封裝函數
2.1創建jQuery對象函數
function getNodes(node{ var nodes = {} if(typeof node === string) { //如果node是字元串則用DOM的API獲取節點 nodes = document.querySelectorAll(node) }else if (a instanceof Node) { //如果node是節點,直接賦給nodes偽數組 nodes = { 0: node, length: 1 } } return nodes}
2.2獲取兄弟節點函數
function getSiblings(node){ var allChildren = node.parentNode.children var array = { length: 0 } for (let i = 0; i < allChildren.length; i++) { if (allChildren[i] !== this) { array[array.length] = allChildren[i] array.length += 1 } } return array}
2.3給所有節點添加類名函數
function addClass(nodes,className) { for(var i = 0; i < nodes.length;i++){ nodes[i].classList.add(className); } }
2.4給所有節點添加文本函數
function setText(nodes,text) { for(var i = 0; i < nodes.length; i++) { nodes[i].textContent = text; }}
3.封裝成函數
3.1寫好每一個功能後需要封裝到一個函數
function jQuery(node) { function getNodes(node{ var nodes = {} if(typeof node === string) { //如果node是字元串則用DOM的API獲取節點 nodes = document.querySelectorAll(node) }else if (a instanceof Node) { //如果node是節點,直接賦給nodes偽數組 nodes = { 0: node, length: 1 } } return nodes } function getSiblings(node){ var allChildren = node.parentNode.children var array = { length: 0 } for (let i = 0; i < allChildren.length; i++) { if (allChildren[i] !== this) { array[array.length] = allChildren[i] array.length += 1 } } return array } function addClass(nodes,className) { for(var i = 0; i < nodes.length;i++){ nodes[i].classList.add(className); } } function setText(nodes,text) { for(var i = 0; i < nodes.length; i++) { nodes[i].textContent = text; } }}
3.2整理函數統一給node屬性
function jQuery(a) { var nodes = {}; if(typeof a === string) { nodes = document.querySelectorAll(a) }else if (a instanceof Node) { nodes = { 0: a, length: 1 } } nodes.addClass = function(className) { for(var i = 0; i < nodes.length;i++){ nodes[i].classList.add(className); } } nodes.setText = function(text) { for(var i = 0; i < nodes.length; i++) { nodes[i].textContent = text; } } nodes.getSiblings = function(){ if(nodes.length === 1){ var allChildren = this.parentNode.children var array = { length: 0 } for (let i = 0; i < allChildren.length; i++) { if (allChildren[i] !== this) { array[array.length] = allChildren[i] array.length += 1 } } return array } } return nodes}
3.3添加到window中,並用$代替
window.jQuery = function (a) { var nodes = {}; if(typeof a === string) { //如果node是字元串則用DOM的API獲取節點 nodes = document.querySelectorAll(a) }else if (a instanceof Node) { //如果node是節點,直接賦給nodes偽數組 nodes = { 0: a, length: 1 } } nodes.addClass = function(className) { for(var i = 0; i < nodes.length;i++){ nodes[i].classList.add(className); } } nodes.setText = function(text) { for(var i = 0; i < nodes.length; i++) { nodes[i].textContent = text; } } nodes.getSiblings = function(){ if(nodes.length === 1){ var allChildren = this.parentNode.children var array = { length: 0 } for (let i = 0; i < allChildren.length; i++) { if (allChildren[i] !== this) { array[array.length] = allChildren[i] array.length += 1 } } return array } } return nodes}window.$ = jQuery
4.jQuery的API使用
4.1代碼
html代碼:
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>JS Bin</title></head><body> <ul> <li id="item1">選項1</li> <li id="item2">選項2</li> <li id="item3">選項3</li> <li id="item4">選項4</li> <li id="item5">選項5</li> </ul></body></html>
js代碼:
window.jQuery = function (a) { var nodes = {}; if(typeof a === string) { //如果node是字元串則用DOM的API獲取節點 nodes = document.querySelectorAll(a) }else if (a instanceof Node) { //如果node是節點,直接賦給nodes偽數組 nodes = { 0: a, length: 1 } } nodes.addClass = function(className) { for(var i = 0; i < nodes.length;i++){ nodes[i].classList.add(className); } } nodes.setText = function(text) { for(var i = 0; i < nodes.length; i++) { nodes[i].textContent = text; } } nodes.getSiblings = function(){ if(nodes.length === 1){ var allChildren = this.parentNode.children var array = { length: 0 } for (let i = 0; i < allChildren.length; i++) { if (allChildren[i] !== this) { array[array.length] = allChildren[i] array.length += 1 } } return array } } return nodes}window.$ = jQueryvar $li = $(li)$li.addClass(red) // 可將所有 li 的 class 添加一個 red$li.setText(hi) // 可將所有 li的 textContent 變為 hivar node2 = jQuery(#item3) // 可以通過選擇器來找到node了node2.getSiblings() //獲取除item3以外的所有的兄弟
4.2效果圖
5.總結
實現jQuery的工作原理:創建一個jQuery構造函數,接收一個節點或者選擇器,並把它封裝成一個偽數組,然後在這個偽數組上增加幾個api,返回這個偽數組。
1、查找(創建)jQuery對象:$("selector");
2、調用jQuery對象的方法完成我們需要完成的工作:$("selector").doOurWork();
Query就是以這種可以說是最簡單的編碼邏輯來改變javascript編碼方式的。這兩個步驟是jQuery的編碼邏輯核心
綜上所述,jQuery給我們帶來了一個簡潔方便的編碼模型(1>創建jQuery對象;2>直接使用jQuery對象的屬性/方法/事件),一個強悍的dom元素查找器($),插件式編程介面(jQuery.fn),以及插件初始化的」配置」對象思想。
推薦閱讀:
※前端日刊-2018.02.06
※前端知識 | CSS小技巧-自適應橢圓
※[小心得]快速搭建一個Vue Live Markdown
※前端日刊-2017.12.27
※越獄環境全局開啟任意 iOS App 的 WebView 調試
TAG:前端開發 |