【发布时间】:2012-08-23 12:57:03
【问题描述】:
在最近的一个项目中,我使用了Alexander Farkas' HTML5 Shiv,我注意到缩小脚本后的大小为 2.274 KB。对于John Resig demonstrated in essentially two lines 的概念,这对我来说似乎相当大(我意识到这过于简单化了,因为 John's 不包括对支持或所有新 HTML5 元素的检查)。我挖掘了html5shiv source。它是 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 中的函数方面具有一定的魔力。这种肉和填充物有必要吗?我的解决方案是否足够充分,或者 Farkas shiv 是否解决了我没有考虑过的问题?
编辑
脚本现在使用正确的声明创建自己的样式标签(仍然只有 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);
【问题讨论】:
-
就个人而言,我认为下载所有额外的代码对于运行 IE6/7/8 的人来说是一种合适的惩罚。事实上,也许我们应该多加几兆,以确保。
-
@SDC 对了!我可能已经有一大堆 IE 特定的 CSS。这算不算? :P 你的评论提醒我,我忽略了
IE lt 9用户可能已经在他们的缓存中拥有 shiv 的事实。但我的问题更多是关于代码膨胀而不是下载时间。 -
希望我下面的真实答案有助于回答这个问题:-)
标签: javascript html html5shiv