成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

高性能封裝檢測瀏覽器支持css3屬性函數(shù)

233jl / 560人閱讀

摘要:我的代碼里多了用下面的代碼測試一下,環(huán)境是老版一點(diǎn)的瀏覽器都只支持帶前綴的這兩個(gè)屬性比如,測試國外代碼第二個(gè)及以后的彈出的都會(huì)是,因?yàn)樗谋M了。

文章來源我的博客園,歡迎GET:http://www.cnblogs.com/aiweidong/p/5112216.html

css3出來已經(jīng)很久了,現(xiàn)在來談判斷瀏覽器是否支持某個(gè)css3的屬性雖說有點(diǎn)過時(shí)了,但是還是可以談?wù)劦?,然后,此篇主要談的不是判斷是否支持,而是怎么封裝更好,為什么這么封裝,歡迎吐槽。

入題,判斷瀏覽器是否支持css3 transition,方法很簡單,只需要下面這句代碼就行了:

"transition" in document.body.style

chrome和ie支持document.body,但是Firefox不支持,F(xiàn)irefox支持document.documentElement,對(duì)于沒有doctype聲明的ie又不支持document.documentElement。
所以用創(chuàng)建一個(gè)都支持的元素,然后通過判斷屬性在元素的style里是否存在即可:

"transition" in document.createElement( "i" ).style

當(dāng)然這是標(biāo)準(zhǔn)下,對(duì)于老點(diǎn)的chrome或者Firefox,它們不支持transition,但是支持帶前綴的transition,比如chrome 里css寫成-webkit-transition: 1s;于是js也需要對(duì)這種情況進(jìn)行判定,向后兼容。

現(xiàn)在貼一段簡潔的封裝代碼,然后再逐步解析,以避免繁雜,產(chǎn)生不了全局觀:

function cssProperty( attr ){

        var prefix = [ "O", "ms", "Moz", "Webkit" ],
            length = prefix.length,

            style = document.createElement( "i" ).style;

        cssProperty =  function( attr ){

            if( attr in style ){

                return true;

            }

            attr = attr.replace( /^[a-z]/, function( val ){

                return val.toUpperCase();

            });

            var len = length;

            while( len-- ){

                if( prefix[ len ] + attr in style ){

                   return true;

                }

            }

            return false;

        };

        return cssProperty( attr );
    }

接下來是一段一段的解釋。

為什么直接聲明prefix = [ "O", "ms", "Moz", "Webkit" ]
而不使用字符串切割prefix = "O ms Moz Webkit".split( " " ),其他人很多都是這樣寫的。
經(jīng)筆者測試,測試代碼如下,為了不必要的影響,我兩段代碼一起測試和兩段代碼分別測試都做了觀察,結(jié)果無差。
為了偷懶,估計(jì)其他瀏覽器應(yīng)該也是差不多的結(jié)果就不做ie的測試了:

測試結(jié)果如下,單位ms:

很明顯,直接聲明prefix = [ "O", "ms", "Moz", "Webkit" ]的代碼執(zhí)行效率更高。
再看[ "O", "ms", "Moz", "Webkit" ]是25個(gè)字節(jié),"O ms Moz Webkit".split( " " )是28個(gè)字節(jié),即便是從文件大小方面,前者也優(yōu)勝過后者。

然而為什么很多國外包括jQuery源碼里都是用split分割的形式呢?
(ps:jQuery-2.1.3源碼5738行寫cssPrefix時(shí),是用的直接賦值,代碼如右:cssPrefixes = [ "Webkit", "O", "Moz", "ms" ])
原因我猜大概是這樣的:對(duì)于分割的字符串種類比較多時(shí),采用split有利于文件字節(jié)的減少,而執(zhí)行效率縮小99999倍后幾乎可以忽略不計(jì),但是對(duì)于文件被下載更快,雖說也可以忽略不計(jì),但是選擇這邊比選擇執(zhí)行效率那邊要好一點(diǎn)吧。
(ps:或許還有個(gè)原因就是書寫split的這條代碼方便吧,不像數(shù)組那樣,一會(huì)單引號(hào),一會(huì)逗號(hào)方括號(hào)的...。如果是為了裝逼就算了)

回歸正題,回歸到我們這里,兩邊我們都勝過,所以,毋庸置疑的就應(yīng)該選擇前者。

● 對(duì)于網(wǎng)上有些不緩存而每次去獲取style的代碼,我想說,難道同個(gè)瀏覽器環(huán)境下,下一秒這個(gè)元素的style就變了嗎,難道不同元素它是style也是變的,難道div元素支持transition,其他某個(gè)元素就不支持transition了?!還有就是不利于壓縮,不利于文件尺寸的減小,提高下載速度。

下面這個(gè)代碼來自國外的誰(當(dāng)然中國好像很多都是直接不假思索的就拷貝過來了):http://code.tutsplus.com/tutorials/quick-tip-detect-css3-support-in-browsers-with-javascript--net-16444

● 仔細(xì)一看,會(huì)發(fā)現(xiàn)為什么我的排列是這樣的:O ms Moz Webkit,而別人的是這樣的:Webkit Moz O ms;
理由來自2015年瀏覽器市場份額排行榜:http://tools.yesky.com/420/93749420.shtml
在國內(nèi),Opera PC版估計(jì)沒什么用,而且它早已轉(zhuǎn)向webkit內(nèi)核了,ie就不談了,對(duì)于開發(fā)者來說坑太多了,看不到好效果就看不到吧,對(duì)不起了。
所以,總體來說,排名依次是chrome,F(xiàn)irefox,ie,opera。
在后面的while循環(huán)判斷代碼中,是倒序判斷的,所以從執(zhí)行效率的角度講,
大部分情況是chrome訪問,所以就第一個(gè)判斷webkit內(nèi)核,滿足條件就跳出循環(huán),減少執(zhí)行,提高運(yùn)行效率。

● 我的代碼里多了 var len = length; 用下面的代碼測試一下,環(huán)境是(老版一點(diǎn)的)瀏覽器都只支持帶前綴的這兩個(gè)屬性(比如Firefox13),測試國外代碼第二個(gè)及以后的alert彈出的都會(huì)是false,因?yàn)樗谋M了len。

alert( cssProperty( "columns" ) )
alert( cssProperty( "animation" ) )

● 函數(shù)封裝如下封裝,如果像國外那種柯里化封裝表示js一加載完就會(huì)執(zhí)行外層的匿名函數(shù),然后把新函數(shù)賦值給supports,如果頁面一定會(huì)用到檢測函數(shù),那么這種方法與下面的封裝效果無差,但是如果頁面不一定用到,即cssProperty變成了整站全局函數(shù),或許另多個(gè)頁面用到,于是像下面這樣封裝就不會(huì)造成函數(shù)的自執(zhí)行,只有第一次調(diào)用函數(shù)的時(shí)候,函數(shù)才會(huì)執(zhí)行,然后被賦予新值,詳情可以參考一下《JavaScript高級(jí)程序設(shè)計(jì)第三版》惰性載入函數(shù)。

function cssProperty( attr ){

     //...code

     cssProperty =  function( attr ){

         //...code

     };

     return cssProperty( attr );
}

最后歡迎訪問我的Github,歡迎Star,歡迎Fork,一起成長。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78444.html

相關(guān)文章

  • javascript功能插件大集合 前端常用插件 js常用插件

    摘要:轉(zhuǎn)載來源包管理器管理著庫,并提供讀取和打包它們的工具。能構(gòu)建更好應(yīng)用的客戶端包管理器。一個(gè)整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數(shù)據(jù)。 轉(zhuǎn)載來源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫,并提供讀取和打包它們的工具。?npm – npm 是 javasc...

    netmou 評(píng)論0 收藏0
  • javascript功能插件大集合 前端常用插件 js常用插件

    摘要:轉(zhuǎn)載來源包管理器管理著庫,并提供讀取和打包它們的工具。能構(gòu)建更好應(yīng)用的客戶端包管理器。一個(gè)整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數(shù)據(jù)。 轉(zhuǎn)載來源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫,并提供讀取和打包它們的工具。?npm – npm 是 javasc...

    Hydrogen 評(píng)論0 收藏0
  • javascript功能插件大集合,寫前端的親們記得收藏

    摘要:一個(gè)專注于瀏覽器端和兼容的包管理器。一個(gè)整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。完全插件化的工具,能在中識(shí)別和記錄模式。健壯的優(yōu)雅且功能豐富的模板引擎。完整的經(jīng)過充分測試和記錄數(shù)據(jù)結(jié)構(gòu)的庫。 【導(dǎo)讀】:GitHub 上有一個(gè) Awesome – XXX 系列的資源整理。awesome-javascript 是 sorrycc 發(fā)起維護(hù)的 JS 資源列表...

    cfanr 評(píng)論0 收藏0
  • 前端動(dòng)畫調(diào)研-V1

    摘要:支持動(dòng)畫狀態(tài)的,在動(dòng)畫開始,執(zhí)行中,結(jié)束時(shí)提供回調(diào)函數(shù)支持動(dòng)畫可以自定義貝塞爾曲線任何包含數(shù)值的屬性都可以設(shè)置動(dòng)畫倉庫文檔演示功能介紹一定程度上,也是一個(gè)動(dòng)畫庫,適用所有的屬性,并且實(shí)現(xiàn)的能更方便的實(shí)現(xiàn)幀動(dòng)畫,替代復(fù)雜的定義方式。 動(dòng)畫調(diào)研-V1 前言:動(dòng)畫從用途上可以分為兩種,一種是展示型的動(dòng)畫,類似于一張GIF圖,或者一段視頻,另一種就是交互性的動(dòng)畫。這兩種都有具體的應(yīng)用場景,比如...

    ddongjian0000 評(píng)論0 收藏0
  • JavaScript 資源大全中文版

    摘要:官網(wǎng)全新的靜態(tài)包管理器。官網(wǎng)一個(gè)整合和官網(wǎng)的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。官網(wǎng)小巧的兼容的所見即所得的富文本編輯器。官網(wǎng)富文本編輯器。官網(wǎng)由制作,適用于每天寫作的富文本編輯器。 1. 包管理器 管理著 javascript 庫,并提供讀取和打包它們的工具。 npm:npm 是 javascript 的包管理器。官網(wǎng) cnpm:cnpm 是 由于國...

    jzman 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<