jQuery重新应用本机不支持的CSS规则(例如在IE中)

时间:2011-09-11 22:27:09

标签: jquery css internet-explorer cross-browser

IE8不支持(例如,但不支持:last-child,所以我常常发现自己做的事情:

/* CSS */
element:last-child,
element.last-child{
    /* properties */
}

/* jQuery */
$('element:last-child').addClass('last-child');

由于jQuery提供了对原生不支持的CSS选择器的支持,有没有办法简单地评估CSS样式表,并且让jQuery( re - )应用样式而不必采用这种无聊的元素分类?

类似的东西:

$('link[rel="stylesheet"]').each(function(){
    $.reapplyStylesheet($(this).attr('href'));
});

注意:鉴于实现特定于浏览器的CSS的方法过多,确实有另一种(也许是更好的)方法可以做到这一点,但我仍然很好奇。

4 个答案:

答案 0 :(得分:1)

http://selectivizr.com/

  

selectivizr是一个JavaScript实用程序,可在Internet Explorer 6-8中模拟CSS3伪类和属性选择器。只需在您的页面中包含脚本,选择将完成其余的工作。

答案 1 :(得分:1)

最简单的方法是使用像IE7-js

这样的填充库

以下是supported (shimmed) selectors in IE7-js的列表。

答案 2 :(得分:1)

任何解决方案都必须做你已经在幕后做的事情。 jQuery通过将它们分开来支持本机不受支持的选择器,并使用选择器的每个部分来执行一些DOM遍历 - 它没有做任何事情来使浏览器更能“理解”:last-child等。

这种DOM遍历必然要慢于CSS引擎解析并应用额外的类,特别是在这种情况下你关心的浏览器中。新的浏览器会有足够快的JS引擎,在很多情况下你都不会注意到这一点 - 但是那些浏览器还支持CSS3选择器。

另一个棘手的问题是构建浏览器是为了忽略(甚至不尝试解析)他们不理解的选择器的CSS规则。因此,您必须通过使用样式表作为一大块文本来进行所有分析和重新应用 - 您将无法通过常规机制访问“损坏”规则。

想象一下,你有一个系统:

  1. 查看所有选择器
  2. 找出当前浏览器无法使用的内容
  3. 然后将这些选择器重建为浏览器可以使用的格式
  4. 然后重写样式表的各个部分以添加新的选择器
  5. 然后应用HTML所需的任何钩子(可能像平常一样添加类)
  6. 我认为,这就是你需要做什么的基础。在旧浏览器中它会很慢 - 非常慢。更好的方法是从DOM角度接近 - 自动添加当前手工操作的类(.last-child)等。

答案 3 :(得分:1)

Modernizr是最好的选择之一。引用网站:

“充分利用HTML5和CSS3的新功能可能意味着牺牲对旧浏览器体验的控制。无论您的访问者使用何种浏览器或设备,Modernizr 2都是您制作最佳网站和应用程序的起点用“。

用于:推特,谷歌,微软等......

微软甚至推出了MVC 3的版本。我相信。