ホームページ > 記事 > ウェブフロントエンド > 一般的に使用される HTML5/CSS3 の新機能検出方法のサンプル コード共有
今後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の新機能を検出するには主に以下の方法があります:
1. グローバルオブジェクト(ウィンドウまたはナビゲーター)に対応する属性名があるかどうかを確認する 2. 要素を作成し、要素 対応する属性はありますか? 3. 要素を作成し、要素にメソッド名があるかどうかを確認し、メソッドを呼び出して正しく実行できるかどうかを確認します。 4. 要素を作成し、対応する属性に値を割り当てます。要素の属性を取得し、この属性の値を取得して割り当てが有効かどうかを確認します。ブラウザによって動作が異なるため、いくつかの機能を検出する場合は、上記のメソッドを組み合わせて使用することがあります。共通の特徴を検出するメソッド:
canvasfunction support_canvas(){ var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d')); }
一般的には、canvas要素を作成してgetContext属性を確認することができますが、ブラウザによっては精度が十分ではないため、elemの実行結果を確認することができます。 getContext('2d') 再度。
canvas に関して、追加すべきことの 1 つは、fillText メソッドです。ブラウザは Canvas をサポートしていますが、canvas
APIfunction 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; }
ビデオとオーディオの書き込み方法は似ています。
Boolean 型、take 値は次のとおりです:
"おそらく": ブラウザーはこの形式を完全にサポートします "maybe": ブラウザーはこの形式をサポートする可能性があります
"": 空の文字列、それを示しますサポートされていません
localStorage
function support_localStorage(){ try { return 'localStorage' in window && window['localStorage'] !== null; } catch(e){ return false; } }
cookie
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; }
applicationCachefunction support_applicationCache(){
return !!window.applicationCache;
}
geolocation
function support_geolocation(){ return 'geolocation' in navigator; }input tag
function support_input_autocomplete(){ var elem = document.createElement('input'); return 'autocomplete' in elem; }
function support_input_list(){ var elem = document.createElement('input'); return !!('list' in elem && document.createElement('datalist') && window.HTMLDataListElement); }
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虽说是HTML4就有的,但HTML5提供了新的方法,检测方法如下:
function support_history(){ return !!(window.history && history.pushState); }
function support_webgl(){ return !!window.WebGLRenderingContext; }
function support_postMessage(){ return !!window.postMessage; }
HTML5的拖拽特性:
function support_draggable(){ var p = document.createElement('p'); return ('draggable' in p) || ('ondragstart' in p && 'ondrop' in p); }
unction support_webSocket(){ return 'WebSocket' in window || 'MozWebSocket' in window; }
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事件是否支持,就没必要写上面那么多东西了,可以简单书写如下:
function support_touch_event(){ return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch); }
Mozilla还提供了一个媒体查询的语句用来检测touch的支持性:touch-enabled,可以在页面上插入一个带有此媒体查询的元素来判断是否支持touch事件
不过我们做移动开发一般都只考虑webkit内核了,Mozilla的方式就不写了,如果需要请参考Modernizr源码。
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
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 サイトの他の関連記事を参照してください。