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];
});
});
应该保留.state。为什么最初要删除这个类?
答案 0 :(得分:0)
为什么最初要移除此类?
让我们一步一步地完成它:
className
为"mute state"
。
classNames.indexOf("mute state")
为-1
,因此index
为0
。
$(this).removeClass("mute state");
删除了mute
和state
。
返回classNames[0]
,即mute
。由于您刚刚删除了mute
,toggleClass
会将其重新添加回来。
最终结果是删除了state
。
您可能不想在removeClass
内调用toggleClass
,而className
不是单个类,它是一个包含所有类的字符串。
答案 1 :(得分:0)
您可以尝试这样的事情:
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/
答案 2 :(得分:0)
我将如何做到这一点:
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]);
});
答案 3 :(得分:0)
这是我的猜测:
$(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
]);
});