【问题标题】:How can I prevent Cufón from replacing text in elements under a certain class?如何防止 Cufón 替换某个类下元素中的文本?
【发布时间】:2011-06-10 03:40:34
【问题描述】:

我正在使用 Cufón 替换网页上的文本,并且已加载 jQuery 库。我正在尝试替换 <li> 元素的所有实例(其中包括 <p> 等),但前提是它们出现在某个类下。

这里是一些示例 HTML:

<ul>
   <li>This</li>
   <li>Should</li>
   <li>Be Replaced</li>
</ul>
<div>
  <ul>
    <li>So should</li>
    <li>this</li>
  </ul>
</div>
<div class='no-cufon'>
   <ul>
      <li>Don't replace this</li>
   </ul>
</div>

请注意,我的大部分 HTML 都是动态的 - 否则我将继续更改标记。

我正在使用命令 Cufon.replace('*:not(.no-cufon) li'); 替换文本,但它仍然针对 all &lt;li&gt; 标签

在我的开发者控制台 (Chrome 12) 中,我使用这些 jQuery 选择器获得以下值:

$("body *").length
11
$("body *:not(.no-cufon)").length
10
$("body * li").length
6
$("body *:not(.no-cufon) li").length
6

由于某种原因,no-cufon 类下的 &lt;li&gt; 标记仍在我的最终 jQuery 选择器中匹配。

如果这不起作用——那会怎样?

【问题讨论】:

  • 请注意,* 仅在单独使用时才需要。与您的问题无关。
  • 你是说我可以用:not(.no-cufon)代替*:not(.no-cufon)

标签: html css css-selectors cufon


【解决方案1】:

filter() 怎么样?使用以下内容,它会选择所有没有 no-cufon 父母的 li 元素。

Cufon.replace($('li').filter(function(){
    if ($(this).parents('.no-cufon').length == 0) return true;
}));

示例: http://jsfiddle.net/niklasvh/prr4W/

【讨论】:

  • 比我希望的稍微复杂一些(纯 CSS 没有办法做到这一点吗?)但它解决了它。谢谢!
  • @beanland 我花了 10 分钟的时间试图获得一个仅适用于任何情况的 CSS 解决方案,但没有骰子。
【解决方案2】:

body :not(.no-cufon) libody .no-cufon ul li 匹配相同的lis,因为uls 本身就是:not(.no-cufon)

试试这个:

Cufon.replace('body > :not(.no-cufon) > li, body > :not(.no-cufon) > ul > li');

【讨论】:

  • 除非您有一个非常严格且可预测的 HTML 结构来应用样式,否则尝试使用 CSS 选择器按祖先排除元素是非常不可靠的。我怀疑我的答案是否适用于您的示例 HTML。
  • 事实上,也许我应该删除答案中的“试试这个”部分,但这会使其不完整,不是吗?
  • 非常有帮助,而且效果很好,但是,正如你提到的,不幸的是,它并没有扩展到示例之外。 :(
  • @beanland:好吧,我忘了你正在使用带有 Cufón 的 jQuery。你可以接受 Niklas 的回答,它会起作用的。
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 2021-11-07
  • 1970-01-01
  • 2017-03-15
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
相关资源
最近更新 更多