JavaScript中动态添加/移除样式

3
有没有一种方法可以在任何浏览器中添加/删除类名?例如,如果我有一个具有类名的div,并且我只想删除/添加“name2”,是否有一种方法可以实现这一点?
谢谢, rodchar
3个回答

8
如果您可以使用jQuery:
要删除: $('#div1').removeClass('name2') 要添加: $('#div1').addClass('name2') 如果您不能使用jQuery,我找到了这个网址: http://snipplr.com/view/3561/addclass-removeclass-hasclass/
function hasClass(ele,cls) {
    return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}

function addClass(ele,cls) {
    if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}

function removeClass(ele,cls) {
    if (hasClass(ele,cls)) {
        var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
        ele.className=ele.className.replace(reg,' ');
    }
}

坦白说,我没有使用过非jQuery方法,但似乎已经足够了。

3

将会有一种标准的方法来实现这个功能。HTML5引入了classList属性,它的用法如下:

element.classList.add('foo');
element.classList.remove('bar');
if (element.classList.contains('bof'))
    element.classList.toggle('zot');

Firefox 3.6已经具备此功能,并且正在WebKit中进行开发。

这里有一个纯JS实现:

// HTML5 classList-style methods
//
function Element_classList(element) {
    if ('classList' in element)
        return element.classList;

    return {
        item: function(ix) {
            return element.className.trim().split(/\s+/)[ix];
        },
        contains: function(name) {
            var classes= element.className.trim().split(/\s+/);
            return classes.indexOf(name)!==-1;
        },
        add: function(name) {
            var classes= element.className.trim().split(/\s+/);
            if (classes.indexOf(name)===-1) {
                classes.push(name);
                element.className= classes.join(' ');
            }
        },
        remove: function(name) {
            var classes= element.className.trim().split(/\s+/);
            var ix= classes.indexOf(name);
            if (ix!==-1) {
                classes.splice(ix, 1);
                element.className= classes.join(' ');
            }
        },
        toggle: function(name) {
            var classes= element.className.trim().split(/\s+/);
            var ix= classes.indexOf(name);
            if (ix!==-1)
                classes.splice(ix, 1);
            else
                classes.push(name);
            element.className= classes.join(' ');
        }
    };
}

// Add ECMA262-5 string trim if not supported natively
//
if (!('trim' in String.prototype)) {
    String.prototype.trim= function() {
        return this.replace(/^\s+/, '').replace(/\s+$/, '');
    };
}

// Add ECMA262-5 Array indexOf if not supported natively
//
if (!('indexOf' in Array.prototype)) {
    Array.prototype.indexOf= function(find, from /*opt*/) {
        for (var i= from || 0, n= this.length; i<n; i++)
            if (i in this && this[i]===find)
                return i;
        return -1;
    };
}

这意味着你需要编写以下内容:
Element_classList(element).add('foo');

这样做可能不太好,但您将获得原生实现更快的优势(如果有的话)。


你可以直接在classList对象上执行element.classList.add('foo')、.remove('foo')和toggle('foo')。https://developer.mozilla.org/en/DOM/element.classList - Clement
嗯...是的,那就是我链接的W3文档指定的完全相同的对象。 :-) 问题在于支持旧版浏览器,因此需要以上的polyfill代码。 - bobince

1

使用JavaScript很容易根据任何事件更改类名,例如:

<script>
function changeClas()
{
    document.getElementById('myDiv').className='myNewClass';
}    
</script>

<div id="myDiv" onmouseover='changeClas()' class='myOldClass'> Hi There</div>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接