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

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

最佳答案

用于更改类的现代 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');
不幸的是,这些在 v10 之前的 Internet Explorer 中不起作用,尽管有 shim添加对 IE8 和 IE9 的支持,可从 this page 获得.不过,它越来越多supported .
简单的跨浏览器解决方案
选择元素的标准 JavaScript 方法是使用 document.getElementById("Id") ,这就是下面的例子使用的——你当然可以通过其他方式获取元素,在正确的情况下可以简单地使用this相反-但是,对此进行详细说明超出了答案的范围。
要更改元素的所有类:
要将所有现有类替换为一个或多个新类,请设置 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 the end of the string or space)
g标志告诉替换根据需要重复,以防类名已被多次添加。
要检查一个类是否已经应用于一个元素:
上面用于删除类的相同正则表达式也可以用作检查特定类是否存在:
if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )

### 将这些操作分配给 onclick 事件:
虽然可以直接在 HTML 事件属性中编写 JavaScript(例如 onclick="this.className+=' MyClass'" ),但不建议这样做。尤其是在较大的应用程序中,通过将 HTML 标记与 JavaScript 交互逻辑分离来实现更可维护的代码。
实现这一点的第一步是创建一个函数,并在 onclick 属性中调用该函数,例如:
<script type="text/javascript">
    function changeClass(){
        // Code examples from above
    }
</script>
...
<button onclick="changeClass()">My Button</button>
(脚本标签中不需要此代码,这只是为了简化示例,将 JavaScript 包含在不同的文件中可能更合适。)
第二步是将 onclick 事件从 HTML 中移到 JavaScript 中,例如使用 addEventListener
<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 工作或任何可能具有不寻常的跨浏览器行为的事情,那么值得考虑。
(非常粗略地说,库是为特定任务设计的一组工具,而框架通常包含多个库并执行一套完整的职责。)
上面的示例已在下面使用 jQuery 进行了复制。 ,可能是最常用的 JavaScript 库(尽管还有其他值得研究的库)。
(注意 $ 这里是 jQuery 对象。)
使用 jQuery 更改类:
$('#MyElement').addClass('MyClass');

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

if ( $('#MyElement').hasClass('MyClass') )
此外,jQuery 提供了一个快捷方式来添加一个不适用的类,或者删除一个适用的类:
$('#MyElement').toggleClass('MyClass');

### 使用 jQuery 将函数分配给单击事件:
$('#MyElement').click(changeClass);
或者,不需要 id:
$(':button:contains(My Button)').click(changeClass);

https://stackoverflow.com/questions/195951/

相关文章:

html - 如何禁用 textarea 的 resizable 属性?

html - 如何使用 CSS 为文本或图像赋予透明背景?

html - 如何使浏览器窗口的 div 高度为 100%?

html - 如何使 div 不大于其内容?

javascript - 如何在不重新加载页面的情况下修改 URL?

javascript - 如何在 HTML5 localStorage/sessionStorage

html - 如何使用 CSS 垂直居中文本?

html - 如何创建一个类似于链接的 HTML 按钮?

html - HTML 中 id 属性的有效值是什么?

javascript - 我如何知道通过 jQuery 选择了哪个单选按钮?