javascript - 如何使用JavaScript更改元素的类?

标签 javascript html dom

如何使用JavaScript更改HTML元素的类以响应onclick事件?

最佳答案

更改类的现代HTML5技术

现代浏览器添加了classList,它提供了一些方法,可以更轻松地在不需要库的情况下操作类:

document.getElementById("MyElement").classList.add('MyClass');

document.getElementById("MyElement").classList.remove('MyClass');

if ( document.getElementById("MyElement").classList.contains('MyClass') )

document.getElementById("MyElement").classList.toggle('MyClass');


不幸的是,尽管有一个shim可以将对它的支持添加到IE8和IE9(可从this page获得),但这些在v10之前的Internet Explorer中无法使用。不过,它越来越多了。

简单的跨浏览器解决方案

选择元素的标准JavaScript方法是使用supported,这是以下示例所使用的-您当然可以通过其他方式获取元素,并且在正确的情况下,可以简单地使用document.getElementById("Id")-但是,详细介绍这超出了答案的范围。

更改元素的所有类:

要将所有现有类替换为一个或多个新类,请设置className属性:

document.getElementById("MyElement").className = "MyClass";


(您可以使用以空格分隔的列表来应用多个类。)

要将附加类添加到元素:

要将类添加到元素中而不删除/影响现有值,请添加空格和新的类名,如下所示:

document.getElementById("MyElement").className += " MyClass";


要从元素中删除类:

要在元素中删除单个类而又不影响其他潜在类,则需要简单的正则表达式替换:

document.getElementById("MyElement").className =
   document.getElementById("MyElement").className.replace
      ( /(?:^|\s)MyClass(?!\S)/g , '' )
/* Code wrapped for readability - above is all one statement */


此正则表达式的解释如下:

(?:^|\s) # Match the start of the string, or any single whitespace character

MyClass  # The literal text for the classname to remove

(?!\S)   # Negative lookahead to verify the above is the whole classname
         # Ensures there is no non-space character following
         # (i.e. must be end of string or a space)


this标志告诉替换根据需要重复,以防类名被多次添加。

要检查类是否已应用于元素:

上面用于删除类的正则表达式也可以用作检查特定类是否存在的检查:

if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )




将这些操作分配给onclick事件:

尽管可以直接在HTML事件属性(例如g)内编写JavaScript,但不建议这样做。特别是在较大的应用程序上,通过将HTML标记与JavaScript交互逻辑分开,可以实现更具可维护性的代码。

实现此目的的第一步是创建一个函数,然后在onclick属性中调用该函数,例如:

<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }
</script>
...
<button onclick="changeClass()">My Button</button>


(不需要在脚本标签中包含此代码,这只是为了简化示例,将JavaScript包含在不同的文件中可能更合适。)

第二步是将onclick事件移出HTML并移入JavaScript,例如使用onclick="this.className+=' MyClass'"

<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }

    window.onload = function(){
        document.getElementById("MyElement").addEventListener( 'click', changeClass);
    }
</script>
...
<button id="MyElement">My Button</button>


(请注意,需要window.onload部分,以便在HTML加载完成后执行该函数的内容-否则,调用JavaScript代码时MyElement可能不存在,因此该行将失败。)



JavaScript框架和库

上面的代码全部使用标准JavaScript,但是通常的做法是使用框架或库来简化常见任务,并受益于在编写代码时可能不会想到的固定错误和边缘情况。

虽然有些人认为添加〜50 KB的框架来简单地更改类是过大的,但是如果您正在做大量的JavaScript工作或任何可能具有异常跨浏览器行为的事情,则值得考虑。

(大致来说,库是为特定任务而设计的一组工具,而框架通常包含多个库并执行一整套职责。)

上面的示例已在下面使用addEventListener(可能是最常用的JavaScript库)进行了复制(尽管还有其他值得研究的示例)。

(请注意,这里的$是jQuery对象。)

使用jQuery更改类:

$('#MyElement').addClass('MyClass');

$('#MyElement').removeClass('MyClass');

if ( $('#MyElement').hasClass('MyClass') )


另外,jQuery提供了一种捷径,用于添加不适用的类,或删除适用的类:

$('#MyElement').toggleClass('MyClass');




使用jQuery将功能分配给click事件:

$('#MyElement').click(changeClass);


或者,不需要ID:

$(':button:contains(My Button)').click(changeClass);

关于javascript - 如何使用JavaScript更改元素的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55117407/

相关文章:

javascript - 使用 jQuery 禁用输入不起作用

javascript - ember.js 和服务器

JavaScript Canvas 下载

html - 标识号 (ID) 的输入元素

javascript - HTML 通过属性值 JavaScript 函数获取元素

jQuery 选择第 1 个元素 "level"

javascript - React Native - 为什么我的图像按钮在 Android 上闪烁?

jquery - 创建日记应用程序。本地存储有问题

php - 如何检测和删除不必要的 xmlns :<something> attributes in PHP DOM?

javascript - 使用 Mongoose 中对象数组的循环保存模型。全部插入后需要回调