今年の10月末にはHTML5の標準版がリリースされ、今後HTML5を使用するシーンはますます増えていくことになり、Web開発者にとっては楽しみなところです。しかし、はっきりと見なければならない現実があります。それは、IE シリーズのブラウザが依然として IE8 と 9 を中心に大きなシェアを占めており、我が国の Windows 8.1 のユーザーはすでに IE10/11 を使用しているということです。国の状況により、IE6 と 7 にはまだ多くのものが残っています。 HTML5 開発を手放す場合、新機能サポートのテストは不可欠です。 1 つの方法は、navigator.userAgent または navigator.appName を使用してブラウザの種類とバージョンを検出することです。ただし、この方法は、ブラウザによっては徐々にサポートされているため、100% サポートしているとは言えません。そのうちのHTML5。さらに、IE11 は嫌な動きをしました。UA の「MSIE」マークを削除し、appName を「Netspace」に変更し、-webkit- というプレフィックスが付いた CSS 属性をサポートし始めました。これは、Chrome を装ったリズムです。したがって、HTML5/CSS3 サポートを検出するには、機能検出 (図形検出) または機能検出に依存することをお勧めします。この記事では、一般的に使用されている検出方法を紹介します。
HTML5 の新機能を検出するための主な方法は次のとおりです:
1. グローバル オブジェクト (ウィンドウまたはナビゲーター) に対応する属性名があるかどうかを確認します。
2. 要素を作成し、存在するかどうかを確認します。対応する属性があります
3. 要素を作成し、その要素にメソッド名があるかどうかを確認し、メソッドを呼び出して正しく実行できるかどうかを確認します
4. 要素を作成し、値を割り当てます。要素の対応する属性を取得して、その属性の値を取得し、割り当てが有効かどうかを確認します
ブラウザごとに動作が異なるため、いくつかの機能を検出する場合は、上記のメソッドを組み合わせて使用することがあります。上記のメソッドを使用して共通の特徴を検出します:
function support_canvas(){ var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d')); }
一般的に言えば、canvas 要素を作成して getContext 属性を確認できますが、一部のブラウザでは精度が十分ではないため、実行結果を確認してください。もう一度 elem.getContext('2d') を実行すると、問題なく動作します。上記のコードは Modernizr からの抜粋です: http://www.php.cn/
Canvas に関して、追加すべき 1 つのことは、ブラウザは Canvas をサポートしていますが、Canvas が fillText メソッドをサポートしているかどうかはわかりません。 API は、いくつかの歴史的な理由により、さまざまな変更を受けています。fillText のサポートを検出する方法は次のとおりです:
function support_canvas_text(){ var elem = document.createElement('canvas'); var context = elem.getContext('2d'); return typeof context.fillText === 'function'; }
function support_video(){ return !!document.createElement('video').canPlayType; } function support_audio(){ return !!document.createElement('audio').canPlayType; }
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 の戻り値はブール型ではなく、値は次のとおりです:
"おそらく": ブラウザーはこの形式を完全にサポートします
"maybe": ブラウザーはこの形式をサポートする可能性があります
"": 空の文字列、そうでないことを示しますサポートされています
一般的には、次のように、グローバル オブジェクトに 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; } }
input タグの新しい属性には、オートコンプリート、オートフォーカス、リスト、プレースホルダー、最大、最小、複数、パターン、必須、ステップが含まれます。サポートされているかどうかを確認するには、次を使用します。前述の方法 2 では、新しい入力タグを作成し、次の属性があるかどうかを確認します。オートコンプリートを例に挙げます。
function support_webWorker(){ return !!window.Worker; }
さらに、 list 属性には特に注意してください。 datalist タグなので、チェックするときは、datalist タグがそれをサポートしているかどうかも確認する必要があります。 :
function support_applicationCache(){ return !!window.applicationCache; }
新しいタイプの入力タグ
ここでのタイプは、新しい入力タイプの値を指します。含まれるもの: 検索、電話番号、URL、電子メール、日時、日付、月、週、時刻、ローカル日時、数値、範囲、色。これらの値を検出するには、数値を例として、上記の方法 4 を使用する必要があります:
function support_geolocation(){ return 'geolocation' in navigator; }
これは、より単純なチェック方法です。厳密に言えば、ブラウザーは、タイプや実装ごとに異なる外観を提供するためです。たとえば、 Chrome の範囲タイプは次のようになります:
「サポートされている」とみなされる前に、ブラウザがこのタイプに対応する実装を提供していることを正確に知る必要があります。この側面から検出するのは困難です。はい、それぞれです。ブラウザはそれを別の方法で実装します。 Modernizr での実装は参考のために以下に掲載されています: 電子メール タイプの検出の実装:function support_input_autocomplete(){ var elem = document.createElement('input'); return 'autocomplete' in elem; }
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] || 'p'); 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('p'); } 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; })()
如果仅仅是检查touch事件是否支持,就没必要写上面那么多东西了,可以简单书写如下:
function support_touch_event(){ return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch); }
Mozilla还提供了一个媒体查询的语句用来检测touch的支持性:touch-enabled,可以在页面上插入一个带有此媒体查询的元素来判断是否支持touch事件。参考:http://www.php.cn/
不过我们做移动开发一般都只考虑webkit内核了,Mozilla的方式就不写了,如果需要请参考Modernizr源码。
css3属性支持度的检测,主要通过上面方法提到的2和4来检查,不过我们要检查的是元素的style属性。另外一个要提的就是浏览器私有前缀,在现阶段我们用css3属性大部分是要写前缀的,因为各浏览器还未完全支持。我们用到的前缀有:-webkit-、-ms-、-o-、-moz-,至于前缀-khtml-,这是Safari早期使用的,现在基本也没有人再用它了,所以进行检测的时候就把它省去了。Modernizr移除了此前缀的检测,详见:http://www.php.cn/
通用代码如下:
var support_css3 = (function() { var p = document.createElement('p'), vendors = 'Ms O Moz Webkit'.split(' '), len = vendors.length; return function(prop) { if ( prop in p.style ) return true; prop = prop.replace(/^[a-z]/, function(val) { return val.toUpperCase(); }); while(len--) { if ( vendors[len] + prop in p.style ) { return true; } } return false; }; })();
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 p = document.createElement('p'); p.id = 'css3_3d_test'; body.appendChild(p); support = p.offsetLeft === 9 && p.offsetHeight === 3; } return support; }
需要借助上面定义好的support_css3方法来检测perspective。
基本常用检测的就这些了,本文中一部分代码是网上搜来的,还有一部分是从Modernizr源码中抽离出来的。如文中叙述有误,欢迎指正。
在实际开发中,推荐直接使用Modernizr进行检测,它已经封装的非常漂亮了。但是如果你仅仅检测几个属性,或者不想因加载额外的库而浪费性能,就可以使用上述代码进行单个检测
以上がコード検出 HTML5/CSS3 の新機能のブラウザー サポートの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。