如何onclick
使用 JavaScript更改 HTML 元素的类以响应一个或任何其他事件?
如何使用 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,可从此页面获得。不过,它得到越来越多的支持。
简单的跨浏览器解决方案
选择元素的标准 JavaScript 方法是 using 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 事件属性(例如onclick="this.className+=' MyClass'"
)中编写 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 中,例如使用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);
你也可以这样做:
document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');
并切换一个类(如果存在则删除,否则添加它):
document.getElementById('id').classList.toggle('class');
在我没有使用 jQuery 的旧项目之一中,我构建了以下函数来添加、删除和检查元素是否具有类:
function hasClass(ele, cls) {
return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}
function addClass(ele, cls) {
if (!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, ' ');
}
}
因此,例如,如果我想onclick
向按钮添加一些类,我可以使用它:
<script type="text/javascript">
function changeClass(btn, cls) {
if(!hasClass(btn, cls)) {
addClass(btn, cls);
}
}
</script>
...
<button onclick="changeClass(this, "someClass")">My Button</button>
到目前为止,使用 jQuery 肯定会更好。
你可以node.className
像这样使用:
document.getElementById('foo').className = 'bar';
根据PPK,这应该适用于Internet Explorer 5.5及更高版本。
哇,很惊讶这里有这么多矫枉过正的答案......
<div class="firstClass" onclick="this.className='secondClass'">