如何处理浏览器特定的.js和.css

时间:2020-03-06 14:33:08  来源:igfitidea点击:

这不是一个新话题,但是我很好奇每个人如何处理特定于浏览器的.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差异。