Jquery hasClass用于多个类

时间:2011-06-08 14:14:01

标签: javascript jquery

我有,

<tr valign="top">
    <th class="chkCol fixed">..checkbox..</th>
    <th class="fixed">..head..</th>
</tr>

现在在Jquery中我调用的函数是

if($(this).hasClass("fixed")){
   ....
}

如果我调用$(this).hasClass("fixed"),那么我需要只获取头部而不是复选框,这在Jquery 1.4.2中工作正常,但现在我更新到jquery 1.6.1。 现在我在条件中收到了复选框。

请帮助,

提前致谢

5 个答案:

答案 0 :(得分:9)

如果jQuery 1.4.2出错,我会非常惊讶 jQuery 1.4.2没有错。在所有版本的jQuery中,hasClass("fixed")都适用于这两种情况。 Here's an example使用v1.6.1,the same example使用v1.4.2。两者都很好。

如果你想检查“修复”它是一个元素上的 only 类,没有jQuery就更容易完成,直接转到反射属性:

if (this.className === "fixed") {
    // ...
}

className是反映“class”属性的属性,就像“class”属性一样,它是一个以空格分隔的字符串。

当然,如果元素上还有任何其他类,上面的内容也将失败,例如“fixed something-else”。

如果您特别想检查它是否已“修复”并且没有“chkCol”,那么您必须故意这样做:

var $this = $(this);
if ($this.hasClass("fixed") && !$this.hasClass("chkCol")) {
    // ...
}

如果您在选择器中执行此操作(而不是检查已有的元素),则可以使用选择器".fixed:not(.chkCol)"。但是,虽然可以使用is已经使用的元素执行此操作,但这会不必要地花费(jQuery必须解析选择器)。


更新:您已经说过您已经尝试了&& !$this.hasClass("chkCol")这件事并且没有用。这意味着if条件中的早期已经确定了整个表达式的结果,因此!$this.hasClass("chkCol")部分的结果没有区别(并且不是因为JavaScript短路表达而无法运行。

示例:

var x = 1;

if (x == 1 || $this.hasClass("fixed") && !$this.hasClass("chkCol"))

在这种情况下,因为x1,所以||右边的任何内容都没有看到;表达式的值已经是true


更新2

你说过你正在使用hasClass,但在评论你说的另一个答案时:

  

如果我使用$(this).attr('class') == "fixed",那么根本不会进入条件

我不认为你实际在做的是这个:

if ($(this).attr('className') == "fixed") {
    // ...
}

注意是“className”,而不是“class”。如果那就是你正在做的事情,1.6.1上的将不起作用,但它将在1.4.2上。没有名为“className”的属性;有一个名为“class”的属性和一个名为“className”的属性。 jQuery 1.6.x区分属性和属性。

上面的代码使用hasClass,适用于所有版本。或者更改您的代码以使用attr("class")而不是attr("className")

Here's a v1.4.2 example显示attr("className")工作(不应该)。 Here's a v1.6.1 example显示attr("className")无法正常工作(这是正确的)。两个版本都显示了获取“class”属性的正确方法。

答案 1 :(得分:3)

你可以这样做:

if ($(this).attr('className') === 'fixed')

或者:

if ($(this).not('.chkCol').hasClass('fixed'))

我认为最好确保“chkCol”元素从不首先获得“固定”类。

编辑 - 永远敏感的@T。 J. Crowder正确指出,从.jQuery 1.6开始,“。attr()”是从元素中获取属性值的错误方法。有一定程度的天使针舞涉及解释为什么会这样,但足以说你现在使用:

if ($(this).prop('className') === 'fixed')

答案 2 :(得分:1)

似乎更新修复了一个错误,然后:) hasClass("fixed")应该对这两个th元素定义为true。

至于你的问题,要么明确排除chkCol类:

if ($(this).hasClass("fixed") && !$(this).hasClass("chkCol")) {

或找到一些标识您要查找的元素的标准(标记名称,ID,另一个专用类等)。

答案 3 :(得分:1)

那么,它肯定是jQuery 1.4.2中的一个错误,因为<th class="chkCol fixed">..checkbox..</th>显然有“固定”类。

如果你想获得一个只有“固定”类的元素你可以做

($(this).attr('class') == "fixed")

答案 4 :(得分:1)

也许你应该使用attr()代替:

if($(this).attr("class") == "fixed"){
   ....
}