在当今使用 HTML5 时,许多人知道您需要包含 “HTML5 shiv” 来确保 CSS 能够识别并能够在尚未支持 HTML5 的浏览器中为这些元素设置样式。
<!--[if IE]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
感谢 Remy Sharp、Jon Neal、John Resig 和所有为该想法做出贡献的人。 为了那些不支持 HTML5 的浏览器的利益,最好将许多 HTML5 元素重置为块级元素,因为它们应该是这样的。
article, aside, figure, footer, header, hgroup,
menu, nav, section { display: block; }
现在我们都准备使用和设置 HTML5 元素的样式。 但是等等! 如果我们通过 JavaScript 动态地将 HTML5 添加到页面中会发生什么?
var s = document.createElement('div');
s.innerHTML = "<section>Hi!</section>";
document.body.appendChild(s);
或在 jQuery 中
$("body").append("<section>Hi!</section>");
支持 HTML5 的浏览器运行良好,但 Internet Explorer 再次无法识别新元素,也无法对其应用 CSS。

Joe Bartlett 为这个问题编写了一个很棒的解决方法,名为 HTML5 innerShiv,我认为更多人应该知道它。
2013 年 1 月更新:现在已包含在规范的 html5shiv 项目中,您应该使用它。 本项目中的其余部分已过时。 如果您使用 html5shiv,则不再需要这样操作。
使用它
请注意,此脚本不需要 jQuery。 它只是普通的 JavaScript,并且可以与任何库或根本没有库一起使用。
1. 下载
下载脚本 并将其插入到您的页面中。 或者,如果您想避免额外的 HTTP 请求,可以将脚本复制并粘贴到您已加载的其他 JavaScript 中。
2. 在插入之前将所有 HTML 内容包装在 innerShiv 函数中
以下是与上面相同的 jQuery 示例,已使用 innerShiv 进行修改。
$("body").append(innerShiv("<section>Hi!</section>"));

有点不相关,但我一直在思考这个问题,也许这里有人会给出答案。(这不仅是为了优雅降级;我有一些客户使用 IE 6-7,有时被迫禁用 javascript。)
整个 html5 shiv 事情是否可以不依赖 javascript 完成? IE 的本机行为 (.htc) 是否可以用于强制识别?
好问题,我不确定,但值得去了解。
我认为 .htc 仍然需要启用 JavaScript。
我似乎找不到关于此的直接答案。 我知道 HTC 使用 javascript 和 VBscript(microsoft.com 上的一些文章(请参阅项目符号 2 下面的说明)似乎暗示您可以运行二进制文件),但我无法确定当 javascript 被禁用时它是否都被关闭了。
如果他们禁用了 Javascript,则不需要 shiv,因为无法通过 Javascript 添加任何 HTML5 元素。(假设我正确理解了此脚本的用途)
实际上,我指的是一般使用 html5 元素/属性的问题,而不是通过 javascript 添加它们(因此我最初评论中的“有点不相关”)。
当然,您对 Chris 在本文中描述的
innerShiv
的说法是正确的。来自 Joe 的页面
“关于 jQuery 的说明
从 innerShiv 创建 jQuery 对象时,您应该传递第二个参数——布尔值 false——它指示 innerShiv 返回元素数组而不是文档片段:”
跨浏览器问题一直很麻烦
是的! 六个月前我遇到了完全相同的问题,并且不得不放弃 HTML5 项目的某些部分,因为这个问题。 我必须尝试回去看看 IE 是否能够与 innerShiv 很好地配合使用。
感谢您的提示!
我喜欢这个想法,但我的问题是我有一些需要 innerShiv 的 jquery 插件。 我觉得这需要在更高级别上实现,这样就不必重写所有这些 javascript 了。
它很小,您可以将其直接放入您的 jQuery 插件中,而不会产生太多问题。 虽然这是一个有趣的想法,但我不知道 jQuery(或其他库)是否会考虑将这个想法整合到核心库中。
查看 Jaxer 的服务器端 JavaScript 实现。 如果您在服务器端运行 HTML Shiv,则正常的客户端 JS 问题会消失,并且不会出现特殊的 IE 问题。
在某些情况下,您可能不想将 innerShiv 应用于您的 HTML(例如,如果 HTML 是表格片段——请参阅 github 项目的 issues 页面以了解更多信息)。 因此,在将它编织到通用插件和库中时要小心。
这个人不能只是将他的贡献发送给 html5shiv 团队吗? 一个已经建立的 html5 实用程序 js 比在每个页面上逐个添加黑客修复更好…
这个想法的范围与 HTML shiv 有点不同。 这仅在将内容动态插入页面时才需要,而不是针对每个使用 HTML5 元素的页面。 我同意,超级相似的名称有点令人困惑。
很好的修复;已记录下来。
这个问题一直困扰着我,让我无法使用新的 HTML5 元素。 感谢您提醒我。
这应该整合到 jQuery 核心库中,这样您就可以继续使用 .append(),而不必担心 .innershiv()。
为什么要使用 html5,如果它在许多浏览器中尚不支持? xHTML 有什么问题?! 一样的东西... 我知道你们中的许多人这样做,因为他们认为它很酷,很好。 添加 100 个 js 来使其工作并不酷!
主要缺点是 ie6
ie6 已经快 10 年了
也许你应该问问自己,为什么你还在拖着脚,不愿接受改变?
HTML5 标签使您的标记更简洁更有效!
并不酷 !!!! :)
我同意 Bobby 的说法。 人们总是急于接触新鲜事物,却在之后才发现所有问题。 HTML5 是新的流行语,而时髦的编码人员需要跟上潮流并谈论它。 标记更简洁? 最终用户并不关心。 谷歌也不关心,它优先考虑价值。 目前,您无法在 HTML5 中完成任何在旧版 HTML/Flash 中无法完成的新功能。 聪明人会等到它变得有用时才使用它,这不是火箭科学,很容易学习。
感谢您提醒这个问题 - 它仍然鲜为人知。Jon Neal 还制作了一个名为 Shimprove 的脚本,可以解决相同的问题
http://www.iecss.com/shimprove/
这是否也包括广泛使用的 html5shiv 的功能?我不太确定,但我在上面提到的网站上这样理解的...
Chris,
感谢您持续的努力。CSS-tricks 始终是我每天必看的网站。我理解想要让 html 5 在浏览器采用比预期更快的时间内生效的愿望,但我好奇的是,Javascript 是否是这里应该采用的方式?
"section" 等标签的意义在于扩展 html 的语义范围,而不是为了“做”某件事(例如,div 标签也可以正常工作)。如果 Javascript 是插入标记的代理,那么搜索引擎机器人就看不到它,而且实际上它也不会以任何方式帮助您的网站更具表现力或更有意义。
我很乐意让搜索引擎在我的设计中看到更具表现力和语义的标记,但似乎服务器端解决方案是目前唯一能够实现这一点,同时仍然保持跨浏览器支持的方法。
继续努力!
关于语义的所有讨论。它究竟是针对谁的?从长远来看,网络拥有更好的结构是好事。但是搜索引擎会如何处理它?我认为目前还没有人知道。如果 Google 让 html5 网站的排名高于旧网站,那将是愚蠢的。一个好的网站就是一个好的网站,它不应该分析最终用户不关心的细节。如果它确实有好的目的,那么检查它是否比现在投入更多工作更容易,而不是现在投入更多工作呢?
嗯…有没有办法在 innerHTML 上做到这一点,特别是 jQuery.load()?
抱歉如果这个问题听起来很愚蠢,但您是否仍然需要使用正常的 HTML5Shiv 以及这个?
我认为您需要。脚本的作用仅仅是 shiv 使用 JS 插入的代码。最初在页面上编写的代码不是,因此 innerShiv 在这种情况下不适用。
谢谢!:)
IE9 应该对 HTML5 元素有更好的或完全的支持。条件注释应该是
if lt IE9
@Adriano: 如果您编写了一个 if lt IE9 的条件语句,它就表示“如果小于 IE9”。但是,如果您想为 IE9 编写一个条件语句,您可以编写“if IE9”,或者,您也可以编写“if lte IE9”,它表示“如果小于或等于”。
IE9 将有条件地接受两者,但在不同的情况下。
不错,感谢分享
我认为 Html5 很酷,很快就会流行起来。而一些旧版本的 IE6 浏览器肯定会退出!
感谢您提供这个好话题
不错,Chris
只有我发现“shiv”的使用既令人困惑又令人发笑吗?据我所知,“shiv”是一个拼写错误,本来应该使用更合适的词shim。
这无关紧要,而且我确实有点喜欢让 IE 对一个代码shiv进行威胁才能按照我的要求行事的想法。
FYI: http://html5shim.googlecode.com/
我很确定你是对的。Shim 确实更合适。但我认为现在已经太晚了,而且有点有趣。
很棒!几天前我遇到了这个问题,感到绝望,因为它阻止了我使用正确的 HTML5 元素来做我想做的事情。现在我可以做我想做的事情了 - 太棒了!
如果您已经使用 HTML5,那么您很可能也使用 Modernizr。这种功能已经包含在 Modernizr 中,因此不需要单独的库。
我的天哪,太聪明了!
html5boilerplate
-s
嗨,我正在构建我的第一个网站,一直使用 HTML5,但我的客户使用 IE,所以网站必须兼容。没有巧妙的技巧,只有平滑滚动的导航栏,并且使用了 sections 而不是 divs。我已经在头部中包含了 shiv(上面提到过)。我使用的是 mac,所以无法在 IE 中测试。如果您认为有问题,我应该将 sections 改为 divs 吗?
由于 IE9 支持 html 5,我是否也可以使用
<!--[if lt IE 9]>
而不是<!--[if IE]>
,或者这是一个坏主意?ps。似乎关于 html5 innershiv 的这篇文章已更新
引用:“停止!不要使用 innerShiv!html5shiv 现在为 innerHTML 问题提供补丁!更新 html5shiv,您将不再需要使用 innerShiv。”
不知道为什么,但那个 shim 似乎让 win81-64 dw 和 mew 预览感到困惑,可能做了那个可怕的 FP 隐藏代码的事情… 使用 IE11,您获得了除一些转换之外的所有内容。桌面未过滤的 html5,使用它作为发布的网站… 也许。哦,但 Sublime 没有问题,而且 dw 正在变得更好。