jQuery源碼學(xué)習(xí)筆記(5)

瀏覽器測試Support(已移出jQuery蚓庭,作用單獨(dú)插件)

根據(jù)瀏覽器是否支持某項(xiàng)特定的功能特性甸鸟,來決定程序的執(zhí)行分支

由于$.browser基于navigator.userAgent檢測瀏覽器類型,很容易被用戶和瀏覽器欺騙崭添,并且缺乏靈活性和不夠全面终佛。

因此最好避免編寫基于特定瀏覽器的代碼。

相對于$.browser墨辛,$.support針對瀏覽器特定特性的檢測則更為有效。

$.browser的實(shí)現(xiàn)代碼如下:

// 用戶代理檢測正則表達(dá)式定義

var rwebkit = /(webkit)[ \/]([\w.]+)/,

ropera = /(opera)(?:.*version)?[\/]([\w.]+)/,

rmsie = /(msie)([\w.]+)/,

rmozilla = /(mozilla)(?:.*?rv:([\w.]+))?/,

// 到處都是把屬性取出來趴俘,作為局部變量使用睹簇,可以減少跨作用域查詢,提高性能

userAgent = navigator.userAgent,

// 用戶代理匹配結(jié)果

browserMatch,

// 實(shí)際執(zhí)行匹配的函數(shù)

uaMatch: function( ua ) {

ua = ua.toLowerCase();

// 依次匹配各瀏覽器

var match = rwebkit.exec( ua ) ||

ropera.exec( ua ) ||

rmsie.exec( ua ) ||

ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||

[];

// match[1] || "" :match[1]為false(空字符串寥闪、null太惠、undefined、0等)時(shí)疲憋,默認(rèn)為""

// match[2] || "0" :match[2]為false(空字符串凿渊、null、undefined缚柳、0等)時(shí)埃脏,默認(rèn)為"0"

return { browser: match[1] || "", version: match[2] || "0" };},

// 將測試結(jié)果保存至jQuery.browser

browserMatch = jQuery.uaMatch(userAgent);

if ( browserMatch.browser ) {

jQuery.browser[ browserMatch.browser ] = true;

jQuery.browser.version = browserMatch.version;

}

// 不推薦使用safari標(biāo)記,用webkit代替

if ( jQuery.browser.webkit ) {

jQuery.browser.safari = true;

}

Support功能特性檢測法

即根據(jù)瀏覽器是否支持某項(xiàng)特定的功能特性喂击,來決定程序的執(zhí)行分支剂癌,這種方法不考慮瀏覽器類型和版本,也不考慮瀏覽器升級(jí)帶來的變化翰绊,更加安全佩谷、靈活,同時(shí)減少了維護(hù)工作监嗜,因此成為了當(dāng)下主流的檢測方法谐檀。例如綁定load事件的代碼:

// 兼容事件模型,通過檢測瀏覽器的功能特性裁奇,而非嗅探瀏覽器

if ( document.addEventListener ) {

// 使用較快的加載完畢事件

document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );

// 注冊window.onload回調(diào)函數(shù)

window.addEventListener( "load", jQuery.ready, false );

// 如果是IE事件模型

} else if ( document.attachEvent ) {

// 確保在onload之前觸發(fā)onreadystatechange桐猬,可能慢一些但是對iframes更安全

document.attachEvent( "onreadystatechange", DOMContentLoaded );

// 注冊window.onload回調(diào)函數(shù)

window.attachEvent( "onload", jQuery.ready );

// If IE and not a frame

// continually check to see if the document is ready

var toplevel = false;

try {

toplevel = window.frameElement == null;

} catch(e) {}

if ( document.documentElement.doScroll && toplevel ) {

doScrollCheck();

}

}

典型應(yīng)用:盒模型

盒模型是CSS中的一個(gè)概念,CSS 將所有的網(wǎng)頁元素都看做是一個(gè)矩形框刽肠,這個(gè)框由元素的內(nèi)容(content)溃肪、內(nèi)邊距(padding)免胃、邊框(border)和外邊距(margin)組成,

兩種盒模型

IE傳統(tǒng)模型:width和height屬性包括內(nèi)邊距和邊框?qū)挾?/p>

W3C標(biāo)準(zhǔn)模型:width和height屬性不包含邊距和邊框?qū)挾?/p>

尺寸封裝

jQueryn封裝了這兩種盒模型的差異惫撰,統(tǒng)一為W3C標(biāo)準(zhǔn)模型羔沙,并提供了修正后的接口:如下所示:

接口 計(jì)算公式

width, height? content

innerWidth, innerHeight content+padding

outerWidth, outerHeight content+padding+border+可選的margin



Sizzle選擇器

工作原理:

選擇器表達(dá)式:'div>p',

塊表達(dá)式 'div'、'p'

并列選擇器表達(dá)式: 'div, p'

塊分割器:對選擇器表達(dá)式從左到右分割出一個(gè)個(gè)塊表達(dá)式

查找器:對塊表達(dá)式進(jìn)行查找厨钻,找到的DOM元素?cái)?shù)組叫候選集

過濾器:對塊表達(dá)式和候選集進(jìn)行過濾

關(guān)系過濾器: 對塊表達(dá)式之間的關(guān)系進(jìn)行過濾:+ 緊挨著的兄弟關(guān)系扼雏;> 父子關(guān)系;“ ”祖先關(guān)系夯膀;“~”之后的所有兄弟關(guān)系

候選集:查找器的結(jié)果诗充,待過濾器進(jìn)行過濾

映射集:候選集的副本,過濾器和關(guān)系過濾器對映射集進(jìn)行過濾

工作流程:

1.使用塊分割器對選擇器表達(dá)式進(jìn)行分割诱建,從左向右

如果遇到","分割的并列選擇器表達(dá)式蝴蜓,只分割到第一個(gè)逗號(hào)前的選擇器表達(dá)式1,將剩余部分記錄下來涂佃。

2.對最后一個(gè)塊表達(dá)式進(jìn)行查找Sizzle.find励翼,結(jié)果放入到候選集set蜈敢,并將塊表達(dá)式中匹配的字符串部分刪除

3.如果最后一個(gè)塊表達(dá)式不為空(字符串)辜荠,過濾器Sizzle.filter對set進(jìn)行過濾

用分割器,對塊表達(dá)式進(jìn)行進(jìn)行分割抓狭,查找伯病,放到候選集set,刪掉塊表達(dá)式中已匹配的否过,剩余的部分記錄下來

查找器進(jìn)行查找匹配午笛,

過濾器對set進(jìn)行過濾

將以上查找和過濾得到候選集set復(fù)制,放入映射集checkSet苗桂,后邊的過濾操作在checkSet上進(jìn)行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末药磺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子煤伟,更是在濱河造成了極大的恐慌癌佩,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件便锨,死亡現(xiàn)場離奇詭異围辙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)放案,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門姚建,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吱殉,你說我怎么就攤上這事掸冤±逋校” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵稿湿,是天一觀的道長催烘。 經(jīng)常有香客問我,道長缎罢,這世上最難降的妖魔是什么伊群? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮策精,結(jié)果婚禮上舰始,老公的妹妹穿的比我還像新娘。我一直安慰自己咽袜,他們只是感情好丸卷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著询刹,像睡著了一般谜嫉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凹联,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天沐兰,我揣著相機(jī)與錄音,去河邊找鬼蔽挠。 笑死住闯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的澳淑。 我是一名探鬼主播比原,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杠巡!你這毒婦竟也來了量窘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤氢拥,失蹤者是張志新(化名)和其女友劉穎蚌铜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兄一,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厘线,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了出革。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片造壮。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耳璧,到底是詐尸還是另有隱情成箫,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布旨枯,位于F島的核電站蹬昌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏攀隔。R本人自食惡果不足惜皂贩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昆汹。 院中可真熱鬧明刷,春花似錦、人聲如沸满粗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽映皆。三九已至挤聘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捅彻,已是汗流浹背组去。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沟饥,地道東北人添怔。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓湾戳,卻偏偏與公主長得像贤旷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子砾脑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式幼驶。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性。 1....
    LaBaby_閱讀 1,167評論 0 1
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式韧衣。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性盅藻。 1....
    LaBaby_閱讀 1,330評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)畅铭,斷路器氏淑,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 原文鏈接 http://blog.poetries.top/2016/10/20/review-jQuery 關(guān)注...
    程序員poetry閱讀 16,641評論 18 503
  • 如果覺察的話,我們的慣性思維通常就像火車一樣很難剎車硕噩,在任何事情發(fā)生的時(shí)候假残,閃電般就會(huì)有情緒反應(yīng),而且我們在舊有的...
    代號(hào)邊城閱讀 579評論 0 0