最近のプロジェクトでは、Alexander Farkas の HTML5 Shivを使用しました。縮小すると、スクリプトが 2.274 KB になることに気付きました。これは、 John Resig が基本的に 2 行で示した概念としてはかなり大きいように思えました( John には、新しい HTML5 要素のサポートまたはすべてのチェックが含まれていないため、これは非常に単純化されすぎていることがわかります)。html5shiv のソースを掘り下げてみました。これは 248 sloc で、このような単純なタスクには不要なコードがたくさんあるように見えました。わずか 14 行で、はるかに単純な shiv を実現しました。
(function(document) {
var div = document.createElement('div'),
elements = 'article|aside|audio|canvas|details|figure|figcaption|footer|header|hgroup|nav|output|progress|section|summary|video'.split('|'),
i = 0,
length = elements.length;
div.innerHTML = '<header></header>';
if(div.childNodes.length != 1) {
for(; i < length; i++) {
document.createElement(elements[i]);
}
}
})(document);
縮小すると、わずか 270 バイトです (Farkas Shiv のサイズから 88% 節約できます)。適切な CSS と組み合わせると、IE 6、7、および 8 で正しく機能しました。
article,aside,audio,canvas,figure,figcaption,footer,header,hgroup,nav,output,progress,section,video{display:block;}
Farkas shiv の本質は、try/catch 内で要素を作成し、関数をチェックするという魔法のようです。この肉とフィラーは必要ですか?私の解決策は十分ですか、それともファルカスのシブは私が考慮していないことを説明していますか?
編集
スクリプトは、適切な宣言を使用して独自のスタイル タグを作成するようになりました (まだ 21 行しかありません!)。
(function(document) {
var div = document.createElement('div'),
elements = 'article,aside,audio,canvas,figure,figcaption,footer,header,hgroup,nav,output,progress,section,video',
elementArr = elements.split(','),
i = 0,
length = elementArr.length,
script, style;
div.innerHTML = '<header></header>';
if(div.childNodes.length != 1) {
for(; i < length; i++) {
document.createElement(elementArr[i]);
}
script = document.getElementsByTagName('script')[0];
style = document.createElement('style');
style.innerHTML = elements+'{display: none}';
script.parentNode.insertBefore(style, script)
}
})(document);