使用 jQuery/JavaScript 在 IE8 中伪造 CSS :only-child

Posted

技术标签:

【中文标题】使用 jQuery/JavaScript 在 IE8 中伪造 CSS :only-child【英文标题】:Faking CSS :only-child in IE8 with jQuery/JavaScript 【发布时间】:2013-10-12 23:54:06 【问题描述】:

我有一个带有 :only-child 选择器的菜单,以便我可以指示子菜单。 :after 选择器在 IE8 中工作(我必须支持的唯一旧 IE 版本),但 :only-child 选择器不能,所以我在每个菜单项上都有一个箭头,而不仅仅是在带有子菜单的那些上。

.menu li > a:after  content: ' ▾'; 
.menu li > a:only-child:after  content: ''; 

我想要的是使用 jQuery 或 javascript 来实现这一点。 我不想使用 Modernizr 或 Selectivizr 之类的东西,只需要一个代码来替代独生子女。

如果您能帮助我,我将不胜感激。我是 jQuery 和 JavaScript 的新手,所以请详细解释一下。谢谢!

【问题讨论】:

【参考方案1】:

jQuery implements most CSS selectors for you,包括:only-child,这使得在旧浏览器中使用更新的选择器来定位元素变得非常容易。事实上,Selectivizr 依赖于另一个 JavaScript 库,例如 jQuery,以便将选择器直接实现到 CSS 中。

如果您可以使用 jQuery,您可以简单地让 jQuery 处理 :only-child 选择器,为唯一的孩子分配一个类,然后您可以使用您的 CSS 规则定位该类。与 Selectivizr 不同,jQuery 只允许您在脚本中使用选择器,而不能直接在样式表中使用1,因此您必须改用类名。

CSS:

.menu li > a:after  content: ' ▾'; 
.menu li > a.only-child:after  content: '';  /* Notice the class selector */

JS:

$('.menu li > a:only-child').addClass('only-child');

1Selectivizr 存在一个已知问题,它会阻止您在选择器中组合伪类和伪元素,因此在这种情况下您将无法使用 Selectivizr无论如何。

【讨论】:

+1 for 'jQuery 为您实现了大多数 css 选择器' 非常感谢您的回答 - 但是,我无法让它在 IE8 仿真模式下工作(不幸的是,我没有要测试的 VM),但我知道仿真不是始终准确。 @Simen Mangseth:它是否可以在其他浏览器中工作,包括默认渲染模式下的 IE9/10/11? @BoltClock 通过将脚本和 css 放在 IE8 条件注释 (<!--[if lt IE 9]><![endif]-->) 中,我没有将它应用于超过 IE8。这不是最好的方法吗?我不想在受支持的现代浏览器中添加额外的 JavaScript。 @Simen Mangseth:是的,但在这种情况下,您总是可以暂时为其他浏览器启用它,只是为了检查它是否有效。如果没有,那么可能有其他问题。【参考方案2】:

对于其他对此感到疑惑并且遇到相同问题而无法让@BoltClock 的代码工作的人,如果您将$ 更改为jQuery,它很可能会工作,如下所示:

jQuery("SELECTOR").exampleMethod("EXAMPLESTRING");

【讨论】:

以上是关于使用 jQuery/JavaScript 在 IE8 中伪造 CSS :only-child的主要内容,如果未能解决你的问题,请参考以下文章

JQuery/Javascript:IE 悬停不包括选择框选项?

JQuery

Window.Location 在 IE 中不起作用?

WordPress 插件开发 - 如何使用 JQuery / JavaScript?

jquery/javascript 在输入字段中添加文本

如何在 jQuery / javascript 中使用 each() 进行迭代或循环