強大的jQuery自定義選擇器:css

jQuery中提供了豐富多樣的選擇器射众,利用這些選擇器我們可以完成大多數(shù)任務衣撬,我們現(xiàn)在來思考如下幾個問題:
1.選取字體顏色為紅色的所有元素
2.選出背景顏色為白色的元素
3.選擇出字體大于等于16px的元素
4.選擇出背景為白色并且文字顏色為黃色的元素
5.選出所有字體為紅色的元素的字體為14像素的所有子元素
......
總之一句話:如何通過css的樣式規(guī)則來選擇元素记罚?是不是感覺jQuery自帶的選擇器力不從心了吧,好吧纸颜,高手就是喜歡這個時候出手得意绍绘,鄙人閉關一個時辰,苦思冥想褐耳,悟出了這么一個利器诈闺,吾命其名曰jQuery樣式選擇器。少年铃芦,既然你能看到我這篇博客雅镊,也是有緣人襟雷,就不賣你10塊錢了,點個贊拿去吧仁烹!看看引入樣式選擇器插件后耸弄,上面幾個問題是怎么搞定的

1. $("#c :css({color:'red'})")
2. $("#c :css({backgroundColor:'white'})");
3. $("#c :css({fontSize:'>=16px'})");
4. $("#c :css({backgroundColor:'white',color:'yellow'})");
5. $("#c :css({color:'red'}) :css({fontSize:'14px'})")

原理

jQuery支持擴展選擇器,如:first卓缰、:last都屬于擴展選擇器计呈,我們可以定義自己的擴展選擇器,如上所見征唬,我定義的選擇器就是:css,下面我們來看看如何定義:

$.extend($.expr[':'],{
  selectorName:function(e,i,m){
  //解析自己選擇器捌显,其中m是個數(shù)組,e是當前元素总寒,m[3]便是選
  //擇器字符串,如果返回true代表當前元素被選中扶歪,反之則否 
  }
}

看到這里你是不是覺得自己也能實現(xiàn)了呢?too young too simple! 當然摄闸,我鼓勵你去嘗試, 站在設計者的角度善镰,注意幾個問題:

  1. 如何進行運算符支持?比如問題3中贪薪,要選出字體>=16像素的元素媳禁,如果是小于呢? 或者是不等于呢?
  2. 如何支持多個條件匹配画切,比如問題4中竣稽,既要求背景顏色是白色,而且字體是黃色霍弹,如果我再加上字體小于18像素并且margin-top大于0毫别,并且是定位方式是fixed……
  3. 假如你css代碼中寫了這么一句:color:red,然后你在判斷是否滿足條件時用jquery css("color")取出顏色值a,然后看a和選擇器中的色值是否滿足條件;這樣有問題嗎典格?有岛宦! 因為不同瀏覽器css("color")返回的值是不一樣的,如果返回的是"red"那萬事大吉耍缴,但是返回的可能是#ff0000(這也是紅色砾肺,只不過換了一個16進制的馬甲),這怎么整防嗡?好好想想吧变汪!不過你應該知道,瀏覽器這樣做是可以理解的蚁趁,因為瀏覽器內部認得肯定是一個數(shù)值裙盾,而red這種語義化的寫法只是為了給開發(fā)人員方便而已。

考慮到如上幾個問題,便自然而然的產生了一個最麻煩的新問題:如何設計接口番官?
我們提供的接口要支持關系判斷(>,<,>=,<=,!=)和條件邏輯(&&)庐完。當然,如果太復雜就不應該用選擇器了徘熔,直接寫個函數(shù)去處理门躯,總不能在選擇器里支持js表達式吧。即如此近顷,我們必須找一種優(yōu)雅的解決方案生音,該怎么做?既然不能用js復雜表達式, 那能有其它什么東西本身語法表現(xiàn)力可以勝任我們當下的需求窒升,并且能夠和js很好的結合(這有助于減少我們的代碼量)缀遍,總不能引入一個庫來解析表達式吧。想到這里饱须,想必大家心里自然有了答案域醇,對,就是json. 當然蓉媳,正如上面所示譬挚,最終的接口竟是如此優(yōu)雅,唉酪呻,太完美减宣。

想到這里,一個大問題算是解決了玩荠,當還有另一個棘手的問題沒有結局漆腌,那就是上面提出的第三個問題。 本來我想直接告訴你阶冈,但本文定位不會太深入闷尿,同時也留給你想象的空間,思考過女坑,然后再去看源碼填具,我想我們才會發(fā)生真正意義上的互動與交流,畢竟匆骗,本人劍道已成多年劳景,到如今,很久未遇對手碉就,寂寞啊 枢泰。
在貼出源碼之前,我想請大家猜一下這個插件代碼量铝噩,不用告訴我,自己去看。

源碼地址:https://github.com/wendux/style-selector-jQuery-plugin

還是那句老話:歡迎star! 歡迎點贊(請在簡書原文哦)骏庸!打賞再怎么歡迎毛甲,你也不會,以后就不說了具被。 還有玻募,歡迎訪問我的github主頁,也許你會發(fā)現(xiàn)更多有價值的東西一姿。當然七咧,這都是笨辦法了,聰明的孩子都選擇了直接關注我叮叹。

注:客觀來講艾栋,本插件為當年筆者研究jQuery源碼時,閑來無事蛉顽,找樂子的實驗性產物蝗砾,筆者認為實際工程中的有需求的場景不會多皱碘,了解我的人應該都知道我比較懶团赏,很少有耐心寫博客耗跛,不過功氨,這個插件嫡锌,我曾經在csdn上介紹過一次因块,jQuery社區(qū)插件很多革娄,但關于自定義選擇器的卻很少見捅膘,此次翘地,舊文重寫申尤,一來是由于最近粉絲多了,二來也是為了探發(fā)幽微子眶。

再注:由于之前幾篇文章都是關于前端的瀑凝,有些人誤以為我現(xiàn)在是做前端的,首先謝關心臭杰,不過呢粤咪,還真不是。之所以開博的幾篇文章寫前端渴杆,我之前的想法是前端程序員多些寥枝,吸粉應該比較快。不過你不要害怕磁奖,不會把你帶到溝里囊拜,筆者雖然很謙虛,但也愿意承認一個事實比搭,前端技術雖然廣雜冠跷,但筆者有信心,在國內的前端的江湖,筆者眼里的沒幾個人蜜托,尤雨溪不錯抄囚,阮一峰老師在科普上做的工作也值得肯定。也許還有其它一些人可能像我一樣橄务,平時太懶不怎么宣傳自己所以也不為人知幔托,不過呀,我最近思想發(fā)生了變化蜂挪,所以就開了博客重挑,懶病慢慢治,既然要出世棠涮,就先高調一點谬哀,畢竟我才發(fā)現(xiàn)懶人吸粉不容易啊。

ps:所有互動請在簡書原文哦故爵,簡書我會經巢7啵看,評論也會第一時間回復诬垂,掘金到現(xiàn)在我還不怎么會用劲室,之前幾篇文章更新后想在掘金同步,愣是沒成功结窘,幫助文檔也沒找到很洋,真是的,放棄了隧枫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末喉磁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子官脓,更是在濱河造成了極大的恐慌协怒,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卑笨,死亡現(xiàn)場離奇詭異孕暇,居然都是意外死亡,警方通過查閱死者的電腦和手機赤兴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門妖滔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桶良,你說我怎么就攤上這事座舍。” “怎么了陨帆?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵曲秉,是天一觀的道長采蚀。 經常有香客問我,道長岸浑,這世上最難降的妖魔是什么搏存? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮矢洲,結果婚禮上,老公的妹妹穿的比我還像新娘缩焦。我一直安慰自己读虏,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布袁滥。 她就那樣靜靜地躺著盖桥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪题翻。 梳的紋絲不亂的頭發(fā)上揩徊,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音嵌赠,去河邊找鬼塑荒。 笑死,一個胖子當著我的面吹牛姜挺,可吹牛的內容都是我干的齿税。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼炊豪,長吁一口氣:“原來是場噩夢啊……” “哼凌箕!你這毒婦竟也來了?” 一聲冷哼從身側響起词渤,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤牵舱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后缺虐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芜壁,經...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年志笼,在試婚紗的時候發(fā)現(xiàn)自己被綠了沿盅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纫溃,死狀恐怖腰涧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情紊浩,我是刑警寧澤窖铡,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布疗锐,位于F島的核電站,受9級特大地震影響费彼,放射性物質發(fā)生泄漏滑臊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一箍铲、第九天 我趴在偏房一處隱蔽的房頂上張望雇卷。 院中可真熱鬧,春花似錦颠猴、人聲如沸关划。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贮折。三九已至,卻和暖如春资盅,著一層夾襖步出監(jiān)牢的瞬間调榄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工呵扛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留每庆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓择份,卻偏偏與公主長得像扣孟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荣赶,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案凤价? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,754評論 1 92
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,388評論 24 450
  • 原文鏈接 http://blog.poetries.top/2016/10/20/review-jQuery 關注...
    程序員poetry閱讀 16,645評論 18 503
  • 開了篇,卻不知道要說點什么拔创。 正值暑假利诺,帶了俊寶來了青島。天氣炎熱剩燥,多半時間是呆在屋子里慢逾。晨起爸爸上班了,我把他安...
    四月吉衣閱讀 280評論 0 1
  • 《請回答1988》第19集灭红,甜哭了一眾澤善黨侣滩,心碎了一眾狗善黨。作為堅定的狗善黨变擒,為這個慫boy心疼的同時君珠,...
    意識劉的碎碎念閱讀 461評論 2 2