在最近的一个项目中,我使用了 Alexander Farkas' HTML5 Shiv我注意到当脚本缩小后是 2.274 KB。对于一个 John Resig demonstrated in essentially two lines 的概念,这对我来说似乎很大。 (我意识到这过于简单化了,因为 John 没有包含对支持或所有新 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);
最佳答案
您的代码与 html5_shiv 之间的主要区别在于,您的版本仅适用于 IE 在页面初始加载期间不支持 HTML5 元素的情况。
事实上,如果您在加载后使用 Javascript 修改页面内容,您将会遇到更重要的问题需要处理。
有一次,实际上有一个名为 html5 inner shiv 的辅助脚本,解决了这些问题。但是,主 html_shiv 脚本的更新版本也包含了这些修复,因此不再需要辅助脚本。但这确实意味着主脚本现在要大得多。
这说明了您所看到的代码量。
如果您的 HTML 将是静态的,那么答案是否定的,您不需要所有这些额外的代码;你的版本没问题。 (或者您可以转到 html5_shiv Github 页面并下载以前的版本;早期版本看起来更像您的代码)。
但是如果您打算编写一个包含任何类型动态内容的站点,那么您最好使用 html5_shiv 的完整当前版本。它解决的不仅仅是一个问题。
关于javascript - 自定义 HTML Shiv 的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12092108/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些