原生js實現jquery庫中選擇器的功能(jquery庫封裝一)

?今天是2017.1.1,新的一天,新的一年,新的一年里繼續夯實基礎知識,在工作中多些項目,多思考,多總結,前端是不斷更新,在更新的過程中也是發現樂趣和挑戰自我的過程,希望年輕的我和年輕的javascript在2017年中一同成長

?

今天又一次封裝了一個盒jquery使用方法相同的庫,每次寫都有新的想法,我想著也是碼農的樂趣之一吧,

今天代碼只實現了jquery中部分常用選擇器的功能,以后部分會繼續更新其余部分,所有代碼的注釋已經寫到行間的注釋了,這僅僅是我自己的理解,不妥之處希望大家評論到下面,共同學習才是進步的最好方式

/*** Created by Jason on 2016/12/31.*/
//jquery 的構造函數
function Jquery(arg){//用來存選出來的元素this.elemenets=[];switch(typeof arg){case 'function' :domReady(arg);break;case 'string' :this.elements = getEle(arg);break;case 'object' :this.elements.push(arg);break;}
}
//DOM ready onload 如果參數是函數,則進行domReady操作
function domReady(fn){// FF chromeif(document.addEventListener){//jquery中已經省略false,false解決低版本火狐兼容性問題document.addEventListener('DOMContentLoaded',fn,false);}else{document.attachEvent('onreadystatechange',function(){if(document.readyState=='complete'){fn();}});}
}function getByClass(oParent,sClass){//高級瀏覽器支持getElementsByClassName直接使用if(oParent.getElementsByClassName){return oParent.getElementsByClassName(sClass);}else{//不支持需要選中所有標簽的類名來選取var res=[];var aAll=oParent.getElementsByTagName('*');for(var i=0;i<aAll.length;i++){//選中標簽的全部類名是個str='btn on red'=aAll[i].className   使用正則  reg=/\b sClass \b/gvar reg= new RegExp('\\b'+sClass+'\\b','g');if(reg.test(aAll[i].className)){res.push(aAll[i]);}}return res;}
}//如果參數是str 進行選擇器的操作
function getByStr(aParent,str){//用來存放選中的元素的數組 這個數組在getEle存在,為了每次執行的時候都需要清空,所以使用局部函數的變量var aChild=[];//aParent開始是[document],再執行完getByStr的時候getEle將aParent指向了getByStr函數的返回值aChild數組以確保循環父級下面的所有匹配元素for(var i=0;i<aParent.length;i++){switch(str.charAt(0)){//id選擇器  eg: #box  使用document.getElementById選取case '#':var obj=document.getElementById(str.substring(1));aChild.push(obj);break;//類選擇器  eg: .box  使用上面封裝的getByClass選取case '.'://由于一個標簽可以有多個類選擇器 所以需要進行循環選取var aRes=getByClass(aParent[i],str.substring(1));for(var j=0;j<aRes.length;j++){aChild.push(aRes[j]);}break;//今天先簡單的編寫選擇器  這里我們假設除了id和類選擇器,就是標簽選擇器default:// 如果是li.red  那么用正則來判斷if(/\w+\.\w+/g.test(str)){//先選擇標簽,在選擇類選擇器  使用類選擇器的時候重復選擇器函數即可var aStr=str.split('.');var aRes=aParent[i].getElementsByTagName(aStr[0]);var reg=new RegExp('\\b'+aStr[1]+'\\b','g');//循環選取標簽,注意外層已經有i的循環for(var j=0;j<aRes.length;j++){if(reg.test(aRes[j].className)){aChild.push(aRes[j]);}}//如果是li:eq(2) 或者 li:first這樣的選擇器   書寫正則是的時候注意()可有可以無為? 有或者沒有為* 至少有一個也就是若干個為+   {2,5}這種則為2-5個}else if(/\w+\:\w+(\(\d+\))?/g.test(str)){//講str進行整理    [li,eq,2]  或者  [li,first]var aStr=str.split(/\:|\(|\)/);//aStr[2]是eq、lt、gt傳入的參數,這里使用n來保存var n=aStr[2];//在父級下獲取所有匹配aStr[0]項的標簽var aRes=aParent[i].getElementsByTagName(aStr[0]);//這時候會循環判斷aStr[1]項是的內容,jquery中經常使用的為eq、lt、gt、even、odd、first、lastswitch(aStr[1]){//如果是eq則把第n項傳入aChild數組即可case 'eq':aChild.push(aRes[n]);break;//如果是lt需要將aRes數組中獲取到的小于n的標簽循環推入aChild中case 'lt':for(var j=0;j<n;j++){aChild.push(aRes[j]);}break;//如果是gt則和lt相反case 'gt':for(var j=n;j<aRes.legth;j++){aChild.push(aRes[j]);}break;//如果是event的話需要隔數添加,注意jquery中的event是從第0開始循環的case 'event':for(var j=0;j<aRes.length;j+=2){aChild.push(aRes[j]);}break;//如果是odd的和event不同的只是從第1項開始循環case 'odd':for(var j=1;j<aRes.length;j+=2){aChild.push(aRes[j]);}break;//如果是first,則將aRes[0]推入aChildcase 'first':aChild.push(aRes[0]);break;case 'last':aChild.push(aRes[aRes.length-1]);break;}//屬性選擇器  eg:input[type=button] 同樣適用正則來判斷}else if(/\w+\[\w+\=\w+\]/g.test(str)){//將屬性選擇器切成數組   [input,type,button]var aStr=str.split(/\[|\=|\]/g);var aRes=aParent[i].getElementsByTagName(aStr[0]);//在選中標簽中選出有aRes[1]的屬性for(var j=0;j<aRes.length;j++){//把屬性值為aRes[2]的標簽推入aChild中if(aRes[j].getAttribute(aStr[1])==aStr[2]){aChild.push(aRes[j]);}}//標簽選擇器  div、span}else{var aRes=aParent[i].getElementsByTagName(str);for(var j=0;j<aRes.length;j++){aChild.push(aRes[j]);}}break;}}return aChild;
}function getEle(str){//如果是字符串的話先要去除收尾空格  eg:"   on replace   index  play auto   "var arr = str.replace(/^\s+|\s+$/g,'').split(/\s+/g);var aChild = [];var aParent = [document];for(var i = 0;i<arr.length;i++){aChild = getByStr(aParent,arr[i]);aParent = aChild}return aChild;
}//實現jquery $符號的寫法
function $(arg){return new Jquery(arg);
}

轉載請注明。。

轉載于:https://www.cnblogs.com/jasonwang2y60/p/6241399.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456598.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456598.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456598.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubantu下使用vi時,方向鍵變字母輸出、退格鍵無法刪除字符的解決辦法

目錄前言&#xff1a;一、編輯/etc/vim/vimrc.tiny二、安裝vim full版本三、添加”.vimrc”文件 目錄 前言&#xff1a; 最近由于要玩TensorFlow&#xff0c;所以把塵封已久的Ubantu給打開了&#xff0c;不過配置網絡的時候&#xff0c;算是一團糟&#xff0c;出現了在插入模…

《Python爬蟲開發與項目實戰》——第3章 初識網絡爬蟲 3.1 網絡爬蟲概述

本節書摘來自華章計算機《Python爬蟲開發與項目實戰》一書中的第3章&#xff0c;第3.1節&#xff0c;作者&#xff1a;范傳輝著&#xff0c;更多章節內容可以訪問云棲社區“華章計算機”公眾號查看 第3章 初識網絡爬蟲 從本章開始&#xff0c;將正式涉及Python爬蟲的開發。本章…

【python】解決:TypeError: can't send non-None value to a just-started generator

在一個生成器函數未啟動之前&#xff0c;是不能傳遞數值進去。必須先傳遞一個None進去或者調用一次next(g)方法&#xff0c;才能進行傳值操作 def product(c):# c.send(None)for i in range(5):print("生產者產生數據%d"%i)r c.send(str(i))print("消費者消費了…

Shell腳本與vi編輯器:vi啟動與退出、工作模式、命令大全

Vi簡介 Vi是一種廣泛存在于各種UNIX和Linux系統中的文本編輯程序。Vi不是排版程序&#xff0c;只是一個純粹的文本編輯程序。Vi是全屏幕文本編輯器&#xff0c;它沒有菜單&#xff0c;只有命令。Vi不是基于窗口的&#xff0c;所以&#xff0c;這個多用途編輯程序可以用于在任何…

windows環境下,如何在Pycharm下安裝TensorFlow環境

文章目錄目錄前言&#xff1a;1.安裝Anaconda2.安裝Tensorflow3.其他問題4.在pycharm中使用tensorflow目錄 前言&#xff1a; 最近由于工作需要要使用TensorFlow&#xff0c;所以只能狂補相關的知識。本來博主打算在Ubantu上玩&#xff0c;但是由于一些原因還是放棄了這個想法…

python面向對象實現簡易銀行管理員頁面系統【導入自定義模塊】

main.py 人 類名&#xff1a;Person 屬性&#xff1a;姓名 身份證號 電話 卡 行為&#xff1a;卡 類名&#xff1a;Card 屬性&#xff1a;卡號 密碼 余額 行為&#xff1a;銀行 類名&#xff1a;Bank 屬性&#xff1a;用戶列表 提款機提款機 類名&#xff1a;ATM 屬性&#xf…

[轉] dpkg-deb命令

點擊此處閱讀原文 軟件包管理 dpkg-deb命令是Debian Linux下的軟件包管理工具&#xff0c;它可以對軟件包執行打包和解包操作以及提供軟件包信息。 語法dpkg-deb(選項)(參數) 選項-c&#xff1a;顯示軟件包中的文件列表&#xff1b; -e&#xff1a;將主控信息解壓&#xff1b;…

《Effective Debugging:軟件和系統調試的66個有效方法》一第5條:在能夠正常運作的系統與發生故障的系統之間尋找差別...

本節書摘來自華章出版社《Effective Debugging&#xff1a;軟件和系統調試的66個有效方法》一書中的第1章&#xff0c;第1.5節&#xff0c;作&#xff3b;希&#xff3d;迪歐米迪斯斯賓奈里斯&#xff08;Diomidis Spinellis&#xff09;&#xff0c;更多章節內容可以訪問云棲社…

如何安裝多個Python版本以及在Pycharm中切換Python版本

目錄前言&#xff1a; 首先要切換不同的版本&#xff0c;你必須先下載不同的Python版本&#xff0c;整個步驟如下所示&#xff1a;1、下載Python2.7x和Python3.5x版本2、安裝Python2.7x和Python3.5x版本3、配置環境變量&#xff0c;分別添加如下至path路徑4、只修改Python27&am…

【python】邏輯運算符總結

# 邏輯運算符 &#xff1a;構造復雜條件 # 優先級 not > and > or # 邏輯與 and 并且、同時 import random# a random.randint(1,5) # if a > 1 and a < 3_流程控制: # print("true") # else: # print("false") # 可以轉換為假&#…

C#中out和ref之間的區別【轉】

首先&#xff1a;兩者都是按地址傳遞的&#xff0c;使用后都將改變原來參數的數值。 其次&#xff1a;ref可以把參數的數值傳遞進函數&#xff0c;但是out是要把參數清空&#xff0c;就是說你無法把一個數值從out傳遞進去的&#xff0c;out進去后&#xff0c;參數的數值為空&am…

如何打開.ipynb文件

最近碰到文件名后綴為.ipynb文件&#xff0c;起初沒太在意這種文件格式&#xff0c;用Notepad打開之后看到也是類似于JSON格式的信息&#xff0c;以為也是為其他的一些文件服務的&#xff08;類似于配置一些HTML文件的配置文件&#xff09;。但是后來才發現這也是一種文本表示形…

《CCNP TSHOOT 300-135認證考試指南》——2.9節憑記憶完成表格和列表

本節書摘來自異步社區《CCNP TSHOOT 300-135認證考試指南》一書中的第2章&#xff0c;第2.9節憑記憶完成表格和列表&#xff0c;作者 【加】Raymond Lacoste , 【美】Kevin Wallace&#xff0c;更多章節內容可以訪問云棲社區“異步社區”公眾號查看 2.9 憑記憶完成表格和列表CC…

將f2fs文件系統到磁盤

1 用git下載f2fs文件系統tools的源代碼。下載地址如下&#xff1a;http://git.kernel.org/cgit/linux/kernel/git/jaegeuk/f2fs-tools.git 具體的操作如下&#xff1a;git clone git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git 通過以…

【python】list append()和extend()區別

list append() ---》添加一個對象整體 extend() ----》添加迭代的對象 append() 添加單一元素在末尾 my_list [geeks, for] my_list.append(geeks) print(my_list) output: [geeks, for, geeks]添加一個list后&#xff0c;也是只添加一個list對象 my_list [geeks, for…

玩Python遇到的問題一二三及解決辦法

文章目錄問題一&#xff1a;python 2.7版本解決TypeError: encoding is an invalid keyword argument for this function。問題二&#xff1a;python讀取文件時提示"UnicodeDecodeError: gbk codec cant decode byte 0x80 in position 205: illegal multibyte sequence&qu…

《MATLAB圖像處理超級學習手冊》導讀

前言 MATLAB圖像處理超級學習手冊圖像是人類獲取信息的重要來源。當今的信息化社會&#xff0c;對圖像處理和圖像分析的要求越來越高&#xff0c;現有的圖像軟件由于采購成本和功能的限制&#xff0c;已經不能完全滿足專業人士的需要&#xff0c;這時就需要專業人士來編寫自己的…

【python】SOCK_STREAM和SOCK_DGRAM兩種類型的區別【轉】

sock_stream 是有保障的(即能保證數據正確傳送到對方)面向連接的SOCKET&#xff0c;多用于資料(如文件)傳送。 sock_dgram 是無保障的面向消息的socket &#xff0c; 主要用于在網絡上發廣播信息。 SOCK_STREAM是基于TCP的&#xff0c;數據傳輸比較有保障。SOCK_DGRAM是基于U…

JavaScript將字符串中的每一個單詞的第一個字母變為大寫其余均為小寫

要求&#xff1a; 確保字符串的每個單詞首字母都大寫&#xff0c;其余部分小寫。 這里我自己寫了兩種方法&#xff0c;或者說是一種方法&#xff0c;另一個是該方法的變種。 第一種&#xff1a; function titleCase(str) {var newarr,newarr1[]; newarr str . toLowerCase() .…

聊天機器人的分類及綜述

文章目錄[toc] 目錄前言&#xff1a;1、技術方向2、chatbot的知識框架3、應用的分類4、chatbot的幾個challenges5、工業應用綜述總結&#xff1a;目錄 前言&#xff1a; 最近由于工作需要&#xff0c;要開發一款智能客服&#xff0c;目前正在搞業務咨詢模塊的功能&#xff0c…