如何处理浏览器特定的.js和.css
这不是一个新话题,但是我很好奇每个人如何处理特定于浏览器的.js
或者.css
。
我们是否具有带有.if / else条件的.js函数,或者每个浏览器都有单独的文件?
如今,每个流行的浏览器的当前版本确实是一个问题吗?
解决方案
我使用一个框架来处理99%的xbrowser内容。
对于框架中未涵盖的所有内容,我将使用if / else或者try / catch。
这是一个非常现实的问题。主要是因为IE6. 我们可以使用条件注释来处理IE6特定的CSS。
对于JavaScript,我建议使用已经完成大部分抽象化浏览器差异工作的库。 jQuery在这方面确实很棒。
不写吗?
老实说,对于大多数布局而言,并不是特定于浏览器的CSS确实是必需的,请考虑更改布局。当下一个需要另一种变化的浏览器出现时,会发生什么?呸。如果我们确实需要包含某些内容,但似乎无法在一个浏览器中使用它,请在此处提出问题!有很多伟大的思想家。
对于JS,有几个框架负责实现跨浏览器的行为,例如jQuery(在本网站上使用)。
对于CSS并非在所有浏览器(大多数是IE6 / 7)中都无法使用的问题来说,这些天来仍然是一个问题。
对于我所做的任何工作,我都不需要单独的JS文件。如果我们使用的是JS库(jQuery,YUI,Prototype等),则将解决99%的浏览器不兼容问题。
至于CSS,我更喜欢将针对浏览器的修复程序保留在同一CSS文件中。当我们只需要在一个地方查看样式时,它就使调试变得容易得多。我们可能需要花费数小时来调试某些东西,以便仅发现该错误是由10行浏览器特定的样式表引起的。
从性能的角度来看,最好只包含1个CSS和1个JS文件。
我使用jQuery的内置函数进行实际检测:
jQuery.each(jQuery.browser, function(i, val) {});
至于组织,这取决于应用程序。我认为最好将它放在初始化代码中,然后在需要的地方使用检测。我仍然有一些问题,有时我不得不检测资源管理器。例如,当使用jQuery时,我发现与Firefox相比,资源管理器中的parent()和next()函数有时具有不同的含义。
Internet Explorer具有条件构造,例如
<!--[if IE]> <link rel="stylesheet" type="text/css" href="ie.css" /> <![endif]-->
这样我们就可以为IE引入特定的样式表和JavaScript。如果没有符合标准的方法来解决问题,我认为这是万不得已的解决方案。
使用所谓的"特征检测"。
例如,如果要使用document.getElementsByClassName
,请执行以下操作:
if(document.getElementsByClassName) { // do something with document.getElementsByClassName } else { // find an alternative }
至于CSS,如果使用标准,则在IE中应该会很好。在IE中,使用条件注释是Microsoft伙计们推荐的方法。
无论是if / else还是单独的文件,都取决于站点的复杂性。
浏览器之间肯定仍然存在不兼容性,因此请考虑让JavaScript框架为我们完成肮脏的工作...
jQuery的
http://jquery.com/
道场
http://www.dojotoolkit.org/
Script.aculo.us
http://script.aculo.us/
原型
http://prototypejs.org/
就我个人而言,如上所述,我主要使用了条件注释。
不过,在Stackoverflow播客中,Jeff表示Stackoverflow正在使用Yahoo的CSS Reset,这是我从未听说过的。如果按照广告宣传的方式做,那似乎可以解决许多(大多数?全部?)基于浏览器的CSS差异。至少在Stackoverflow html源代码中我看不到任何指示条件注释的内容。我肯定会在下一个Web项目中使用它,并且很想听听任何人的使用经验。
就Javascript而言;正如已经说过的那样,请使用我们喜欢的JS框架...
IE条件注释的缺点是下载了额外的文件。我更喜欢使用几个著名的CSS过滤器:
.myClass { color: red; // Non-IE browsers will use this one *color: blue; // IE7 will see this one _color: green; // IE6 and below will see this one }
(是的,它无法验证,但是最后我检查了一下,我们的钱来自用户和广告商,而不是W3C。)
如果我们正在进行ASP.Net开发,则还可以使用设备筛选(今天我刚刚在Stack Overflow上了解到了此功能)。
我们可以在Page Directives上使用它来链接不同的外观,母版页或者CSS文件,但也可以在ASP.Net服务器控件属性上使用,如下所示:
<asp:Label runat="server" ID="labelText" ie:CssClass="IeLabelClass" mozilla:CssClass="FirefoxLabelClass" CssClass="GenericLabelClass" />
当然,该示例有些极端,但是它确实使我们可以在仅使用一个CSS文件的情况下解决一些讨厌的浏览器不一致问题。
我还赞同使用CSS重置文件的想法,并且绝对使用jQuery之类的库,而不是重新发明JavaScript事件和DOM差异。