Eine intelligente Umschaltklasse in jQuery

7

Ich versuche ein Skript zu implementieren, um einen anderen Klassennamen für ein bestimmtes Element festzulegen ...

Nehmen wir an, das Dom sieht so aus:

%Vor%

Wenn ich

mache %Vor%

Ich habe den folgenden Code gemacht, aber es funktioniert nicht:

%Vor%

Anforderungen:
1) Ich benutze die Abfrage
2) Ich möchte nur einen Klassennamen übergeben, den neuen.

Lösung:
Der folgende Code funktioniert, aber ich mag es nicht, weil er globale Variable verwendet.
Irgendein Hinweis, um es zu beheben?

%Vor%     
Lorraine Bernard 16.10.2012, 08:13
quelle

11 Antworten

8

Sie können das Datenattribut für das Element verwenden, auf das mit

zugegriffen werden kann %Vor%

In Ihrer Methode ist nur eine kleine Änderung erforderlich.

%Vor%

kann durch

ersetzt werden %Vor%

Hoffe das löst es für dich.

    
Ankur 18.10.2012, 10:15
quelle
5

Aktualisierung:

Es gibt eine Sache, die du verstehen musst. Wenn Sie zwei verschiedene Verhaltensweisen verwenden möchten, müssen Sie nicht zwei verschiedene Klassen für die Verhaltensänderung verwenden . Eins ist genug, weil Sie das Verhalten basierend auf der Klasse auf oder aus ändern können.

Nehmen wir an, ich möchte, dass mein Element in einer bestimmten Weise ein rotes Hover-Ereignis hat. Und möchte, dass es einen blauen Hover-Event mit CSS in umgekehrter Richtung gibt. Dann ist dies der richtige Weg:

%Vor%

JSFiddle Demo

Hier verwenden wir eine Schaltfläche, um alle Divs umzuschalten und ihr CSS-Verhalten zu ändern, sieht jetzt einfach aus, oder?

Wenn Sie jedoch auch Javascript / jQuery-Ereignisse aktivieren müssen, ist dies nicht möglich. In diesem Fall müssen Sie 3 andere Methoden verwenden, um dies zu verwalten; .on() , .off() und .hasClass() .

%Vor%

JSFiddle Demo 2

Wie Sie sehen können, haben wir eine if-Anweisung hinzugefügt. Wenn das Element die Klasse .active hat, drehen wir .off() die .click() . Und wenn es keine aktive Klasse gibt, drehen wir .click() .on() . Unter der if-Anweisung schalten wir immer die .active -Klasse ein. Das muss also nicht in der if-Anweisung stehen.

Ich hoffe, das macht alles für euch klar, viel Glück!

Alte Antwort:

Es ist besser hier .toggleClass() zu verwenden.

Verwenden Sie eine erste Klasse für das Element für die Standardeigenschaften und eine zweite wie .active für die Interaktion.

Durch Verwendung von .on('click', function(){}) bind können Sie außerdem eine Interaktion hinzufügen, die sofort gebunden wird, sobald das Element umgeschaltet wird.

    
Sem 16.10.2012 08:15
quelle
3

Hier ist eine Geige: Ссылка

Ich habe ein kleines jQuery-Plugin dafür. Entfernt die aktuelle Smart-Klasse (falls vorhanden) und fügt die neue Smart-Klasse hinzu. Ohne Aufruf des Parameters className wird die aktuelle Smart-Klasse nur entfernt.

%Vor%

verwende es wie jede andere jQuery-Methode:

%Vor%     
lrsjng 19.10.2012 22:55
quelle
2

NEUE, EINFACHERE ANTWORT Funktioniert ähnlich wie zuvor, mit 2 Ergänzungen: 1.) funktioniert, wenn es keine Klasse zu Beginn gibt und 2.) funktioniert, wenn andere Funktionen die Elementklasse zwischen Aufrufen ändern. Ich änderte auch den Funktionsnamen, so dass es nicht in jQuerys native toggleClass eingreift.

%Vor%

aktualisierte Geige: Ссылка

ALTE ANTWORT Ich würde vorschlagen, die ursprüngliche Klasse im Elementdatenattribut zu speichern. Dann kann Ihre Funktion prüfen, ob diese Daten gesetzt sind, und wenn dies der Fall ist, löschen Sie die Elementklasse, indem Sie die ursprüngliche Klasse aus den Elementdaten und auch die neue Klasse, die Sie in der Funktion übergeben haben, hinzufügen.

Wenn keine Daten festgelegt sind, speichert die Funktion die aktuelle Klasse bei der ersten Ausführung als Daten.

Sieh dir diese Geige für ein funktionierendes Beispiel mit Kommentaren an: Ссылка

Hier ist der Code. Es ist eine jquery-Funktion, so dass es für jedes Element aufgerufen werden kann (und auch verkettbar ist!)

%Vor%

Hoffe, das hilft!

    
facultymatt 23.10.2012 21:11
quelle
1

Um eine globale Variable zu vermeiden, können Sie das Datenattribut als @ankur schreiben verwenden. Hier ist eine funktionierende Lösung für Ihr Problem:

%Vor%     
migg 18.10.2012 21:51
quelle
0

Macht das Ihre Arbeit?

%Vor%     
kayen 16.10.2012 08:18
quelle
0

Benutze einfach hasClass . Aber Sie müssen der Funktion mitteilen, welche beide Klassen sind:

%Vor%     
T.J. Crowder 16.10.2012 08:18
quelle
0
%Vor%

Demo - Ссылка (Schau dir die Konsole an, um zu sehen, was sie bei jedem Durchgang macht)

Das sollte tun, was Sie wollen, aber als @ T.J. Crowder sagte, es sei eher fragil und gehe davon aus, dass die Klasse, die du entfernen willst, die letzte auf dem Element ist.

    
boz 16.10.2012 08:31
quelle
0

Als Antwort auf Ihre Frage würde ich mit ankurs Antwort

gehen

Als Follow-up zu Sems Antwort zur Behandlung von jQuery-Ereignissen:

Sie können die Funktion on verwenden, um jedes jquery-Ereignis von einem übergeordneten Knoten basierend auf einem Live-Filter zu behandeln:

%Vor%

Hier ist das jsFiddle .

Sie werden feststellen, dass die Funktion, die bei jedem Klicken auf ein Element aufgerufen wird, von ihrer "live" -Klasse abhängt und dass Sie click handlers nicht jedes Mal manuell aktivieren / deaktivieren müssen, wenn ein Element die Klasse ändert.

Weitere Informationen erhalten Sie auf der Dokumentation .

    
LeGEC 23.10.2012 12:09
quelle
0
%Vor%

oder die andere Variante:

%Vor%     
ChuckE 23.10.2012 18:53
quelle
0

In dieser Implementierung müssen Sie einen Verweis auf diese Instanz von fancytoggle behalten.

%Vor%

für Ihr Beispiel würde der Code ungefähr so ​​aussehen.

%Vor%

, um es in Aktion zu sehen, beziehen Sie sich auf Ссылка

    
Nimnam1 24.10.2012 18:35
quelle

Tags und Links