ホームページ  >  記事  >  ウェブフロントエンド  >  一般的に使用される HTML5/CSS3 の新機能検出方法のサンプル コード共有

一般的に使用される HTML5/CSS3 の新機能検出方法のサンプル コード共有

黄舟
黄舟オリジナル
2017-03-21 15:53:571181ブラウズ

今後H5を使うシーンはどんどん増えていくでしょうし、Web開発者にとっては嬉しいことですね。しかし、はっきりと見なければならない現実があります。それは、IE シリーズのブラウザが依然として IE8 と 9 を中心に大きなシェアを占めており、我が国の Windows 8.1 のユーザーはすでに IE10/11 を使用しているということです。国の状況により、IE6 と 7 にはまだ多くのものが残っています。 HTML5 開発を手放す場合、新機能サポートのテストは不可欠です。 1 つの方法は、navigator.userAgent または navigator.appName を使用してブラウザの種類とバージョンを検出することです。ただし、この方法は、ブラウザによっては徐々にサポートされているため、100% サポートしているとは言えません。そのうちのHTML5。さらに、IE11 は、UA の「MSIE」マークを削除し、appName を「Netspace」に変更し、chr ome リズムに偽装する、-webkit- というプレフィックスが付いた CSS 属性 をサポートし始めたという、ひどい動きをしました。したがって、HTML5/CSS3 サポートを検出するには、機能検出 (図形検出) または機能検出に依存することをお勧めします。この記事では、一般的に使用されている検出方法を紹介します。

補足: このメソッドは、IE11 を決定するために引き続き使用できます: /Trident/i.test(navigator.appVersion)、mustache から取得します。

HTML5部分

HTML5の新機能を検出するには主に以下の方法があります:

1. グローバルオブジェクト(ウィンドウまたはナビゲーター)に対応する属性名があるかどうかを確認する 2. 要素を作成し、要素 対応する属性はありますか? 3. 要素を作成し、要素にメソッド名があるかどうかを確認し、メソッドを呼び出して正しく実行できるかどうかを確認します。 4. 要素を作成し、対応する属性に値を割り当てます。要素の属性を取得し、この属性の値を取得して割り当てが有効かどうかを確認します。ブラウザによって動作が異なるため、いくつかの機能を検出する場合は、上記のメソッドを組み合わせて使用​​することがあります。共通の特徴を検出するメソッド:

canvas

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

一般的には、canvas要素を作成してgetContext属性を確認することができますが、ブラウザによっては精度が十分ではないため、elemの実行結果を確認することができます。 getContext('2d') 再度。

canvas に関して、追加すべきことの 1 つは、fillText メソッドです。ブラウザは Canvas をサポートしていますが、canvas

API

にはいくつかの歴史的な理由があり、このメソッドがサポートされているかどうかはわかりません。 support 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;
}

ビデオとオーディオの書き込み方法は似ています。

ビデオ/オーディオでサポートされているリソース形式を検出するには、次のように 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 の戻り値は

Boolean 型

ではなく、

string であることに注意してください。

、take 値は次のとおりです:

"おそらく": ブラウザーはこの形式を完全にサポートします "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 tag

newattributs

New Attributes of 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 タグの新しいタイプ

ここでのタイプは値を指します。新しい入力タイプの値には、検索、電話番号、URL、電子メール、日時、日付、月、週、時刻、日時ローカル、数値が含まれます。 、範囲、色。これらの値を検出するには、数値を例として、前述の方法 4 を使用する必要があります。
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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。