我有一个表,我显示/隐藏一个完整的列由jQuery通过CSS类不存在:

<table>
   <thead>
      <tr>
         <th></th>
         <th class="target"></th>
         <th></th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td></td>
         <td class="target"></td>
         <td></td>
      </tr>
      <tr>
         <td></td>
         <td class="target"></td>
         <td></td>
      </tr>
   </tbody>
</table>

有了这个DOM,我可以在一行通过jQuery: $('.target').css('display','none');

这是完美的工作,但它是有效的使用CSS类没有定义?我应该为它创建一个空类吗?

<style>.target{}</style>

有没有副作用或者有没有更好的方法?


当前回答

这里没有人完全提到的一件事是JavaScript(在本例中由jQuery辅助)不能直接修改文档的级联样式表。jQuery的css()方法仅仅改变匹配的元素的style属性集。CSS和JavaScript在这方面是完全不相关的。

$ (' .target ') . css(“显示”,“没有一个”);不会改变你的.target {} CSS声明。相反,这里发生的是任何具有“target”类的元素现在看起来像这样:

<element class="target" style="display:none;"></element>

没有预先定义CSS样式规则会有什么副作用吗?一点儿也没有呢。

还有更好的办法吗?就性能而言,确实有!

如何提高性能?

不是直接修改每个元素的样式,而是可以预先定义一个新类,并使用addClass()(另一个jQuery方法)将其添加到匹配的元素中。

基于这个已经存在的比较css()和addClass()的JSPerf,我们可以看到addClass()实际上要快得多:

我们自己如何实现它呢?

首先,我们可以在新的CSS声明中添加:

.hidden {
    display: none;
}

您的HTML将保持不变,这个预定义的类只是为以后使用而存在。

我们现在可以修改JavaScript来使用addClass():

$('.target').addClass('hidden');

当运行这段代码时,不是直接修改每个匹配的“目标”元素的style属性,这个新类现在将被添加:

<element class="target hidden"></element>

使用新的“hidden”类,此元素将继承CSS中声明的样式,并且您的元素将被设置为不再显示。

其他回答

根据HTML5规范:

类属性的值必须是由空格分隔的集合 表示元素所属的各种类的标记。 ... 对于作者可以在其中使用的令牌没有其他限制 类属性,但鼓励作者使用 描述内容的本质,而不是描述的价值 内容的理想表示形式。

此外,在版本4中:

class属性在HTML中有几个角色: 作为样式表选择器(当作者希望分配样式时) 一组元素的信息)。 用于一般用途的加工 用户代理。

您的用例属于第二种场景,这使得它成为使用类属性的合法示例。

当您在JavaScript中使用类名时,它不会查看CSS来查找该类。它直接在HTML代码中查找。

所需要的只是类名在HTML中。不需要在CSS中。

事实上,许多人认为在CSS和Javascript中保持单独的类使用是一个好主意,因为它允许设计师和编码员独立工作,而不会因为使用彼此的类而妨碍彼此。

(注意,上面的段落显然更适用于大型项目,所以如果你是独自工作,不要觉得你必须走这个极端;我提到它是为了说明这两者可以完全分开)

使用类来查询元素完全没有问题。我过去常常给这样的类名加上sys-前缀(例如,我将把你的类命名为sys-target),以将它们与用于样式化的类区分开来。这是过去一些微软开发人员使用的惯例。我还注意到越来越多的人使用js-前缀来达到这个目的。

如果你不习惯将类用于样式以外的目的,我建议使用role .js jQuery插件,它允许你使用角色属性来达到相同的目的,所以,你可以将你的标记写为<td role="target">,并使用$("@target")查询它。项目页面有很好的描述和示例。我在大型项目中使用这个插件,因为我真的喜欢只为了样式目的而保留类。

这里没有人完全提到的一件事是JavaScript(在本例中由jQuery辅助)不能直接修改文档的级联样式表。jQuery的css()方法仅仅改变匹配的元素的style属性集。CSS和JavaScript在这方面是完全不相关的。

$ (' .target ') . css(“显示”,“没有一个”);不会改变你的.target {} CSS声明。相反,这里发生的是任何具有“target”类的元素现在看起来像这样:

<element class="target" style="display:none;"></element>

没有预先定义CSS样式规则会有什么副作用吗?一点儿也没有呢。

还有更好的办法吗?就性能而言,确实有!

如何提高性能?

不是直接修改每个元素的样式,而是可以预先定义一个新类,并使用addClass()(另一个jQuery方法)将其添加到匹配的元素中。

基于这个已经存在的比较css()和addClass()的JSPerf,我们可以看到addClass()实际上要快得多:

我们自己如何实现它呢?

首先,我们可以在新的CSS声明中添加:

.hidden {
    display: none;
}

您的HTML将保持不变,这个预定义的类只是为以后使用而存在。

我们现在可以修改JavaScript来使用addClass():

$('.target').addClass('hidden');

当运行这段代码时,不是直接修改每个匹配的“目标”元素的style属性,这个新类现在将被添加:

<element class="target hidden"></element>

使用新的“hidden”类,此元素将继承CSS中声明的样式,并且您的元素将被设置为不再显示。

没有必要在样式表中定义CSS类。它应该可以正常工作。不过,添加它也无妨。