var classNames = ['mute', 'on', 'off', 'none'];
$('.state').click(function () {
$(this).toggleClass(function (i, className) {
var index = (classNames.indexOf(className) + 1) % classNames.length;
alert(className);
$(this).removeClass(className);
return classNames[index];
});
});
Состояние должно быть сохранено. Почему этот класс удаляется изначально?
Почему этот класс удаляется изначально?
Давайте пройдем его шаг за шагом:
className
- это "mute state"
.
classNames.indexOf("mute state")
является -1
поэтому index
равен 0
.
$(this).removeClass("mute state");
удаляет как mute
и state
.
classNames[0]
возвращается, что является mute
. Поскольку вы просто toggleClass
mute
, toggleClass
добавит его обратно.
Конечным результатом является то, что state
удаляется.
Вероятно, вы не хотите вызывать removeClass
внутри toggleClass
а className
- не один класс, а строка, содержащая все классы.
Вы можете попробовать что-то вроде этого:
var classNames = ['mute', 'on', 'off', 'none'];
var counter = -1;
var newClass, oldClass;
$('.state').click(function () {
$(this).toggleClass(function (i, className) {
counter++;
oldClass = newClass || classNames[counter % classNames.length];
newClass = classNames[counter % classNames.length];
$(this).removeClass(oldClass);
return classNames[counter % classNames.length];
});
});
Вы имеете в виду что-то вроде выше? http://jsfiddle.net/Dieterg/a86C3/1/
Вот моя догадка:
$(this).toggleClass(function (i, className) {
className = className.match(new RegExp(
'(?:^|\\s)(' + classNames.join('|') + ')(?=\\s|$)'
))[1];
$(this).removeClass(className);
return classNames[
(classNames.indexOf(className) + 1) % classNames.length
];
});
И демо: http://jsfiddle.net/wared/QZ8Kh/.
Бонус:
var classNames = ['mute', 'on', 'off', 'none'];
$('.state').click(function () {
var className = $(this).attr('class').match(new RegExp(
'(?:^|\\s)(' + classNames.join('|') + ')(?=\\s|$)'
))[1];
$(this).toggleClass(className + ' ' + classNames[
(classNames.indexOf(className) + 1) % classNames.length
]);
});
Вот как я это сделаю:
var classNames = ['mute', 'on', 'off', 'none'];
$('.state').on('click', function () {
var k = 0, self = this;
$.each(classNames, function (i, klass) {
if ($(self).hasClass(klass)) k = i;
});
$(this).removeClass(classNames[k]).addClass(classNames[k==(classNames.length-1) ? 1 : 1+k]);
});