6 Stimmen

Jquery hasClass für mehrere Klassen

Ich habe,

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

Jetzt in Jquery rufe ich eine Funktion wie,

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

Wenn ich anrufe $(this).hasClass("fixed") dann muss ich nur Kopf nicht Checkbox und das funktioniert perfekt in Jquery 1.4.2 aber jetzt habe ich auf Jquery 1.6.1 aktualisiert. Jetzt bin ich immer Checkbox innerhalb wenn Bedingung.

Bitte helfen Sie,

Vielen Dank im Voraus

10voto

T.J. Crowder Punkte 948310

Ich wäre sehr überrascht, wenn jQuery 1.4.2 dies falsch macht Bei jQuery 1.4.2 ist dies nicht der Fall. hasClass("fixed") sollte in beiden Fällen wahr sein, in allen Versionen von jQuery. Hier ein Beispiel mit v1.6.1, und das gleiche Beispiel mit v1.4.2. Beide funktionieren gut.

Wenn Sie überprüfen wollen, ob "repariert" ist, ist es die nur Klasse auf ein Element, das ist leichter getan, ohne jQuery, indem Sie direkt auf die reflektierte Eigenschaft:

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

className ist eine Eigenschaft, die das "class"-Attribut widerspiegelt, und wie das "class"-Attribut eine durch Leerzeichen getrennte Zeichenkette ist.

Der obige Versuch schlägt natürlich fehl, wenn das Element auch eine andere Klasse hat, wie "fixed something-else".

Wenn Sie speziell prüfen wollen, ob er "fixed" und nicht "chkCol" hat, müssen Sie das absichtlich tun:

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

Wenn Sie dies in einem Selektor tun würden (anstatt ein bereits vorhandenes Element zu überprüfen), könnten Sie den Selektor ".fixed:not(.chkCol)" . Aber auch wenn Sie kann dies mit einem Element tun, das Sie bereits haben, indem Sie is ist es unnötig teuer (jQuery muss den Selektor parsen).


更新情報 : Sie haben gesagt, dass Sie die && !$this.hasClass("chkCol") und es hat nicht funktioniert. Das bedeutet, dass etwas früher im if Bedingung bereits das Ergebnis des Ausdrucks als Ganzes bestimmt hat und somit das Ergebnis der !$this.hasClass("chkCol") Teil macht keinen Unterschied (und wird überhaupt nicht ausgeführt, da JavaScript die Ausdrücke kurzschließt).

Ejemplo:

var x = 1;

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

In diesem Fall, weil x es 1 nichts rechts von der || überhaupt in Betracht gezogen wird; der Wert des Ausdrucks ist bereits true .


Aktualisierung 2 :

Sie haben gesagt, Sie verwenden hasClass , aber in einem Kommentar zu einer anderen Antwort sagten Sie:

Wenn ich die $(this).attr('class') == "fixed" und dann überhaupt nicht in die if-Bedingung gehen

Ich nehme nicht an, dass Sie das wirklich tun:

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

Beachten Sie, dass es "className" und nicht "class" heißt. Wenn es das ist, was Sie tun, ist das wird nicht funktionieren auf 1.6.1, aber auf 1.4.2. Es gibt keine Attribut namens "className"; es gibt ein Attribut namens "class" und ein Eigenschaft namens "className". jQuery 1.6.x unterscheidet zwischen Attributen und Eigenschaften.

Mein obiger Code, der hasClass funktioniert bei allen Versionen. Oder ändern Sie Ihren Code und verwenden Sie attr("class") statt attr("className") .

Hier ist ein Beispiel für v1.4.2 unter attr("className") funktioniert (was sie nicht sollte). Hier ist ein Beispiel für v1.6.1 unter attr("className") nicht funktioniert (was korrekt ist). Beide Versionen zeigen den korrekten Weg, um an das Attribut "class" zu gelangen.

3voto

Pointy Punkte 387467

Sie können dies entweder tun:

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

Oder aber:

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

Ich denke, es wäre besser, dafür zu sorgen, dass "chkCol"-Elemente gar nicht erst die Klasse "fixed" erhalten.

bearbeiten - der stets aufmerksame @T. J. Crowder weist korrekt darauf hin, dass ".attr()" seit jQuery 1.6 der falsche Weg ist, um Eigenschaftswerte von Elementen zu erhalten. Es gibt ein gewisses Maß an engelhaften Pin-Tanz in der Erklärung, warum das der Fall ist, aber es genügt zu sagen, dass Sie jetzt verwenden würde:

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

1voto

Xion Punkte 21530

Das Update scheint also einen Fehler behoben zu haben :) hasClass("fixed") sollte definitiv für beide zutreffen th Elemente hier.

Was Ihr Problem betrifft, so sollten Sie entweder explizit ausschließen chkCol Klasse:

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

oder finden Sie ein anderes Kriterium, das das gesuchte Element identifiziert (Tag-Name, ID, eine andere dedizierte Klasse, usw.).

1voto

DanielB Punkte 19472

Nun, dann muss es ein Fehler in jQuery 1.4.2 gewesen sein, weil offensichtlich die <th class="chkCol fixed">..checkbox..</th> hat die Klasse "fest".

Wenn Sie ein Element mit der einzigen Klasse "fixed" erhalten möchten, können Sie Folgendes tun

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

1voto

Alexis No Punkte 11

Vielleicht sollten Sie stattdessen attr() verwenden:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X