搜尋
首頁web前端H5教程常用的HTML5/CSS3新特性能力檢測寫法的範例程式碼分享

  未來使用H5的場景會越來越多,這是令web開發者歡欣鼓舞的事情。然而有一個現實我們不得不看清,那就是IE系列瀏覽器還佔有一大部分市場份額,以IE8、9為主,windows8.1的用戶已經用上了IE10/11,而考慮我國的國情, IE6、7依然存留不少。在我們放手用HTML5開發的時候,新特性支援度檢測就是不可或缺的了。一種方式是用navigator.userAgent或navigator.appName來檢測瀏覽器類型和版本,不過這種方式不是很可靠,瀏覽器對於一些新功能也是在逐漸支持,不能肯定說某個瀏覽器100%支持了HTML5。而且,IE11做了一個噁心的舉動:在UA中去掉了“MSIE”標誌,把appName改為了“Netspace”,並且開始支援-webkit-前綴的css屬性,這是活生生要偽裝成chrome的節奏。所以,HTML5/CSS3支持性的檢測,還是靠特徵檢測(figure detection)或是能力檢測更好。本篇就來介紹常用的檢測方式都有哪些。

  補充:判斷IE11仍可用此方法:/Trident/i.test(navigator.appVersion),get from 小鬍子。

HTML5部分

  偵測HTML5新功能的方法主要有以下幾種:

         1. 檢視全域物件(window或navigator)上有沒有對應的屬性名稱

         2. 建立一個元素,檢查元素上有沒有對應的屬性

         3. 建立一個元素,偵測元素上有沒有方法名稱,然後呼叫方法名稱看能否正確執行

         4. 建立一個元素,為元素的對應屬性賦一個值,然後再取得此屬性的值,看看賦值是否生效

  由於不同瀏覽器的不同行為,偵測一些特性的時候,可能會用到上述幾個方法的組合,接下來用上面的方法做一下常用特性的偵測:

canvas

function support_canvas(){    
var elem = document.createElement('canvas');    
return !!(elem.getContext && elem.getContext('2d'));
}

  一般來講,創建canvas元素並檢查getContext屬性即可,但是在一些瀏覽器下不夠準確,所以再檢測一下elem.getContext('2d')的執行結果,就可以完全確定。

  關於canvas,有一點要補充的,那就是fillText方法,儘管瀏覽器支援canvas,我們並不能確切的確定它支援fillText方法,因為canvas API經歷了各種修改,有一些歷史原因,偵測支援fillText的方法如下:

function support_canvas_text(){    
var elem = document.createElement('canvas');    
var context = elem.getContext('2d');    
return typeof context.fillText === 'function';
}

video/audio

function support_video(){    
return !!document.createElement('video').canPlayType;
}function support_audio(){    
return !!document.createElement('audio').canPlayType;
}

  video和audio的寫法相似。

  要偵測video/audio支援的資源格式,可以呼叫canPlayType方法來進行檢查,具體如下:

unction support_video_ogg(){    
var elem = document.createElement('video');    
return elem.canPlayType('video/ogg; codecs="theora"');
}function support_video_h264(){    
var elem = document.createElement('video');    
return elem.canPlayType('video/mp4; codecs="avc1.42E01E"');
}function support_video_webm(){    
var elem = document.createElement('video');    
return elem.canPlayType('video/webm; codecs="vp8, vorbis"');
}function support_audio_ogg(){    
var elem = document.createElement('audio');    
return elem.canPlayType('audio/ogg; codecs="vorbis"');
}function support_audio_mp3(){    
var elem = document.createElement('audio');    
return elem.canPlayType('audio/mpeg;');
}function support_audio_wav(){    
var elem = document.createElement('wav');    
return elem.canPlayType('audio/wav; codecs="1"');
}

  要注意的是,canPlayType的回傳值並不是布林類型,而是字串,取值有以下幾種:

  • "probably」:瀏覽器完全支援此格式

  • #"maybe":瀏覽器可能支援此格式

  • "":空白字串,表示不支援

localStorage

  一般來講,檢查全域物件是否有localStorage屬性即可,如下:

function support_localStorage(){    
try {        
return 'localStorage' in window && window['localStorage'] !== null;
      } 
    catch(e){        
    return false;
    }
}

  在某些瀏覽器停用cookie,或設定了隱私模式什麼的情況,檢查屬性或報錯,所以加在try語句中,如果報錯了認為不支援。

  另外,還有一種更嚴格的檢查方法,檢查相應方法是否支持,如下:

function support_localStorage(){    
try {        
if('localStorage' in window && window['localStorage'] !== null){
            localStorage.setItem('test_str', 'test_str');
            localStorage.removeItem('test_str');            
            return true;
        }        
        return false;
    } 
    catch(e){        
    return false;
    }
}

webWorker

function support_webWorker(){    
return !!window.Worker;
}

applicationCache

function support_applicationCache(){    
return !!window.applicationCache;
}

geolocation

function support_geolocation(){    
return 'geolocation' in navigator;
}

input標籤新屬性

  input標籤新增的屬性包括:autocomplete、autofocus、list、placeholder、max、min、multiple、pattern、required、step,偵測是否支援用上面提到的方法2即可,新建一個input標籤,看是否有這些屬性,以autocomplete為例:

function support_input_autocomplete(){   
 var elem = document.createElement('input');    
 return 'autocomplete' in elem;
}

  另外要特別注意list屬性,因為它是與datalist標籤連用的,所以檢查的時候要一併檢測datalist標籤是否支援:

function support_input_list(){    
var elem = document.createElement('input');    
return !!('list' in elem && document.createElement('datalist') && window.HTMLDataListElement);
}

input標籤新類型

  這裡的類型就是指type的取值,input新增的type值包括: search、tel、url、email、datetime、date、month、week、time、datetime-local、number、range、color。偵測這些值需要用上面提到的方法4,以number為例:

function support_input_type_number(){    
var elem = document.createElement('input');
    elem.setAttribute('type', 'number');    
    return elem.type !== 'text';
}

  这是一种较为简单的检查方法,因为严格来讲,浏览器会为不同的类型提供不同的外观或实现,例如chrome中range类型会长这样:

  

  我们要确切的知道浏览器为该类型提供了对应的实现,才可以认为是“支持的”,要从这个方面检测是有难度的,各浏览器实现都不一。下面贴出Modernizr中的一个实现,供参考:检测email类型的实现:

function support_input_type_email(){    var elem = document.createElement('input');
    elem.setAttribute('type', 'email');
    elem.value = ':)';    return elem.checkValidity && elem.checkValidity() === false;
}

  为email类型设置了一个非法的value,然后手动调用校验方法,如果返回false,说明浏览器提供了该类型的实现,认为是支持的。

history

  history虽说是HTML4就有的,但HTML5提供了新的方法,检测方法如下:

function support_history(){    return !!(window.history && history.pushState);
}

webgl

function support_webgl(){    return !!window.WebGLRenderingContext;
}

postMessage

function support_postMessage(){    return !!window.postMessage;
}

draggable

HTML5的拖拽特性:

function support_draggable(){    
var p = document.createElement('p');    
return ('draggable' in p) || ('ondragstart' in p && 'ondrop' in p);
}

webSocket

unction support_webSocket(){    
return 'WebSocket' in window || 'MozWebSocket' in window;
}

svg

function support_svg(){    
return !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect;
}

事件的支持性判断

通用方法:

  检查事件的支持性,用上面提到的方法2就可以,创建一个元素,看元素上有没有对应的事件名称,下面是摘自Modernizr的实现:

isEventSupported = (function() {

      var TAGNAMES = {
        'select': 'input', 'change': 'input',
        'submit': 'form', 'reset': 'form',
        'error': 'img', 'load': 'img', 'abort': 'img'
      };

      function isEventSupported( eventName, element ) {

        element = element || document.createElement(TAGNAMES[eventName] || 'div');
        eventName = 'on' + eventName;

        // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
        var isSupported = eventName in element;

        if ( !isSupported ) {
          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
          if ( !element.setAttribute ) {
            element = document.createElement('div');
          }
          if ( element.setAttribute && element.removeAttribute ) {
            element.setAttribute(eventName, '');
            isSupported = is(element[eventName], 'function');

            // If property was created, "remove it" (by setting value to `undefined`)
            if ( !is(element[eventName], 'undefined') ) {
              element[eventName] = undefined;
            }
            element.removeAttribute(eventName);
          }
        }

        element = null;
        return isSupported;
      }
      return isEventSupported;
    })()

View Code

touch事件

  如果仅仅是检查touch事件是否支持,就没必要写上面那么多东西了,可以简单书写如下:

function support_touch_event(){    
return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch);
}

  Mozilla还提供了一个媒体查询的语句用来检测touch的支持性:touch-enabled,可以在页面上插入一个带有此媒体查询的元素来判断是否支持touch事件

  不过我们做移动开发一般都只考虑webkit内核了,Mozilla的方式就不写了,如果需要请参考Modernizr源码。

css3部分

通用方法

  css3属性支持度的检测,主要通过上面方法提到的2和4来检查,不过我们要检查的是元素的style属性。另外一个要提的就是浏览器私有前缀,在现阶段我们用css3属性大部分是要写前缀的,因为各浏览器还未完全支持。我们用到的前缀有:-webkit-、-ms-、-o-、-moz-,至于前缀-khtml-,这是Safari早期使用的,现在基本也没有人再用它了,所以进行检测的时候就把它省去了。Modernizr移除了此前缀的检测,

  通用代码如下:

var support_css3 = (function() {
   var div = document.createElement('div'),
      vendors = 'Ms O Moz Webkit'.split(' '),
      len = vendors.length;
 
   return function(prop) {
      if ( prop in div.style ) return true;
 
      prop = prop.replace(/^[a-z]/, function(val) {
         return val.toUpperCase();
      });
 
      while(len--) {
         if ( vendors[len] + prop in div.style ) {
            return true;
         } 
      }
      return false;
   };
})();

View Code

3D变形

  css3 3D变形的检测稍微复杂些,首先要支持perspective属性,其次要支持transform-style的值为preserve-3d。用方法4的方式无法检测出来,需要借助媒体查询的方式,代码如下:

function support_css3_3d(){
    var docElement = document.documentElement;
    var support = support_css3('perspective');
    var body = document.body;
    if(support && 'webkitPerspective' in docElement.style){
        var style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = '@media (transform-3d),(-webkit-transform-3d){#css3_3d_test{left:9px;position:absolute;height:3px;}}';
        body.appendChild(style);
        var div = document.createElement('div');
        div.id = 'css3_3d_test';
        body.appendChild(div);

        support = div.offsetLeft === 9 && div.offsetHeight === 3;

    }
    return support;
}

  需要借助上面定义好的support_css3方法来检测perspective。

  基本常用检测的就这些了,本文中一部分代码是网上搜来的,还有一部分是从Modernizr源码中抽离出来的。如文中叙述有误,欢迎指正

  在实际开发中,推荐直接使用Modernizr进行检测,它已经封装的非常漂亮了。但是如果你仅仅检测几个属性,或者不想因加载额外的库而浪费性能,就可以使用上述代码进行单个检测。

  先写这么多,以后有想到的再进行补充。

以上是常用的HTML5/CSS3新特性能力檢測寫法的範例程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
掌握microdata:HTML5的分步指南掌握microdata:HTML5的分步指南May 14, 2025 am 12:07 AM

Microdatainhtml5enhancesseoanduserexperienceByByBybyBystructuredDatatoSearchEngines.1)useIteMscope,itemType,anditempropattributestomarkupcontentlikeSoreRoductSssSssSoRorevents.2)

HTML5表格中有什麼新功能?探索新輸入類型HTML5表格中有什麼新功能?探索新輸入類型May 13, 2025 pm 03:45 PM

html5introducesnewinputtypesthatenhanceSerexperience,簡化開發和iMproveAccessibility.1)自動validatesemailformat.2)優化優化,優化OmportizeSmizesemizesemizesemizesemizesemizeSmobobileWithAnumericKeyPad.3)和Simimplifydateandtimeputientupits,並重新替代了Forcustemolcustemolcustene。

理解H5:含義和意義理解H5:含義和意義May 11, 2025 am 12:19 AM

H5是HTML5,是HTML的第五個版本。 HTML5提升了網頁的表現力和交互性,引入了語義化標籤、多媒體支持、離線存儲和Canvas繪圖等新特性,推動了Web技術的發展。

H5:可訪問性和網絡標準合規性H5:可訪問性和網絡標準合規性May 10, 2025 am 12:21 AM

無障礙訪問和網絡標準遵循對網站至關重要。 1)無障礙訪問確保所有用戶都能平等訪問網站,2)網絡標準遵循提高網站的可訪問性和一致性,3)實現無障礙訪問需使用語義化HTML、鍵盤導航、顏色對比度和替代文本,4)遵循這些原則不僅是道德和法律要求,還能擴大用戶群體。

HTML中的H5標籤是什麼?HTML中的H5標籤是什麼?May 09, 2025 am 12:11 AM

HTML中的H5標籤是第五級標題,用於標記較小的標題或子標題。 1)H5標籤幫助細化內容層次,提升可讀性和SEO。 2)結合CSS可定製樣式,增強視覺效果。 3)合理使用H5標籤,避免濫用,確保內容結構邏輯性。

H5代碼:Web結構的初學者指南H5代碼:Web結構的初學者指南May 08, 2025 am 12:15 AM

HTML5構建網站的方法包括:1.使用語義化標籤定義網頁結構,如、、等;2.嵌入多媒體內容,使用和標籤;3.應用表單驗證和本地存儲等高級功能。通過這些步驟,你可以創建一個結構清晰、功能豐富的現代網頁。

H5代碼結構:組織內容以實現可讀性H5代碼結構:組織內容以實現可讀性May 07, 2025 am 12:06 AM

通過合理的H5代碼結構可以讓頁面在眾多內容中脫穎而出。 1)使用語義化標籤如、、等組織內容,使結構清晰。 2)通過CSS佈局如Flexbox或Grid控制頁面在不同設備上的呈現效果。 3)實現響應式設計,確保頁面在不同屏幕尺寸上自適應。

H5與較舊的HTML版本:比較H5與較舊的HTML版本:比較May 06, 2025 am 12:09 AM

HTML5(H5)與舊版本HTML的主要區別包括:1)H5引入了語義化標籤,2)支持多媒體內容,3)提供離線存儲功能。 H5通過新標籤和API增強了網頁的功能和表現力,如和標籤,提高了用戶體驗和SEO效果,但需注意兼容性問題。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境