问:
如何使用 JavaScript 更改 HTML 元素的类以响应 onclick 或任何其他事件?
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
答1:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
用于更改类的现代 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)/) )
虽然可以直接在 HTML 事件属性(例如 οnclick=“this.className+=’ MyClass’”)内编写 JavaScript,但不建议这样做。尤其是在较大的应用程序中,通过将 HTML 标记与 JavaScript 交互逻辑分离来实现更可维护的代码。
实现这一点的第一步是创建一个函数,并在 onclick 属性中调用该函数,例如:
function changeClass(){
// Code examples from above
}
...
My Button
(脚本标签中不需要此代码,这只是为了简化示例,将 JavaScript 包含在不同的文件中可能更合适。)
第二步是将 onclick 事件从 HTML 中移到 JavaScript 中,例如使用 addEventListener
function changeClass(){
// Code examples from above
}
window.onload = function(){
document.getElementById("MyElement").addEventListener( 'click', changeClass);
}
...
My 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');
$('#MyElement').click(changeClass);
或者,不需要 id:
$(':button:contains(My Button)').click(changeClass);
很好的答案彼得。一个问题......为什么使用 JQuery 比使用 Javascript 更好? JQuery 很棒,但如果这就是您需要做的全部 - 有什么理由包括整个 JQuery 库而不是几行 JavaScript?
@mattstuehler 1)短语“更好x”通常意味着“更好(你可以)x”。 2)为了解决问题的核心,jQuery 旨在帮助访问/操作 DOM,并且通常如果你需要在整个地方都做这种事情时需要做这种事情。
此解决方案的一个错误:当您多次单击按钮时,它将多次将“MyClass”的类添加到元素中,而不是检查它是否已经存在。因此,您最终可能会得到一个类似于以下内容的 HTML 类属性:class="button MyClass MyClass MyClass"
如果您尝试删除类“myClass”并且您有一个类“prefix-myClass”,那么您在上面提供的用于删除类的正则表达式将在您的类名中留下“prefix-”:O
哇,三年和 183 次投票,直到现在没有人发现这一点。感谢 jinglesthula,我已经更正了正则表达式,因此它不会错误地删除部分类名。 // 我想这是一个很好的例子,说明为什么框架(如 jQuery)值得使用 - 像这样的错误会很快被捕获和修复,并且不需要更改普通代码。
答2:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
你也可以这样做:
document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');
并切换一个类(如果存在则删除,否则添加它):
document.getElementById('id').classList.toggle('class');
我相信这取决于 HTML5。
您需要 Eli Grey 的 classList 垫片。
Mozilla Developer Network 声明它在小于 10 的 Internet Explorer 中本机不起作用。在我的测试中,我发现该声明是正确的。显然,Internet Explorer 8-9 需要 Eli Grey shim。不幸的是,我在他的网站上找不到它(即使搜索)。垫片可在 Mozilla 链接上找到。
Here's the MDN Documentation for classList。
atow "classList" 在 IE10+ 中有部分支持;不支持 Opera Mini; else 完全支持其余标准浏览器:caniuse.com/#search=classlist
答3:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
在我的一个不使用 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 向按钮添加一些类,我可以使用它:
function changeClass(btn, cls) {
if(!hasClass(btn, cls)) {
addClass(btn, cls);
}
}
...
My Button
现在可以肯定的是,使用 jQuery 会更好。
当您的客户端不允许您使用 jQuery 时,这非常有用。 (因为你最终几乎要建立自己的图书馆。)
@Mike如果客户端不允许您使用jQuery,您是否可以仅将所需的功能重新构建到您自己的库中?
@kfrncs 因为我通常不需要那么大的框架。对于我正在考虑的项目,我需要的唯一函数是 3 个 classname(has,add,remove) 函数和 cookie(has, add, remove) 函数。其他一切要么是定制的,要么是原生支持的。因此,在缩小之前,所有内容加在一起只有 150 行,包括注释。
这是我最喜欢的解决方案。我到处都用它。我相信当您的项目还没有其他方法时,这是实现添加和删除类的最优雅的方法。
需要注意的是,在同一元素上使用 addClass 和 removeClass 后,该元素的 className 将包含一个额外的空格。 removeClass 的 className 修改行应更新为 ele.className = ele.className.replace(reg, ' ').trim().replace(/\s{2,}/g, ' ');。这将删除剩余的尾随空格并将多个空格折叠到 className 中的单个空格中。
答4:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
您可以像这样使用 node.className:
document.getElementById('foo').className = 'bar';
这应该在 Internet Explorer 5.5 及以上根据 PPK 工作。
这将覆盖对象上的任何和所有其他类......所以它不是那么简单。
答5:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
哇,很惊讶这里有这么多矫枉过正的答案…
我会说不显眼的 javascript 是编写示例代码的糟糕做法......
我不同意,因为我认为示例代码应该树立一个很好的榜样。
一个好的例子应该同时指导和激发想象力。它不应该取代思想,而应该激发思想。
其他答案并不过分,它们还保留了元素上的现有类。
答6:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
使用纯 JavaScript 代码:
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, ' ');
}
}
function replaceClass(ele, oldClass, newClass){
if(hasClass(ele, oldClass)){
removeClass(ele, oldClass);
addClass(ele, newClass);
}
return;
}
function toggleClass(ele, cls1, cls2){
if(hasClass(ele, cls1)){
replaceClass(ele, cls1, cls2);
}else if(hasClass(ele, cls2)){
replaceClass(ele, cls2, cls1);
}else{
addClass(ele, cls1);
}
}
答7:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
这对我有用:
function setCSS(eleID) {
var currTabElem = document.getElementById(eleID);
currTabElem.setAttribute("class", "some_class_name");
currTabElem.setAttribute("className", "some_class_name");
}
优秀的答案!只剩下添加:为选择器设置每个CSS类名,为一组类元素指定样式
这在 FF 上对我有用,但是当我尝试使用 el.className = "newStyle";它没有工作,为什么?
您可以使用 el.setAttribute('class', newClass) 或更好的 el.className = newClass。但不是el.setAttribute('className', newClass)。
答8:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
可能的 4 种操作:添加、删除、检查和切换
让我们看看每个动作的多种方式。
1.添加类
方法 1: 在现代浏览器中添加类的最佳方法是使用元素的 classList.add() 方法。
案例一:添加单类函数 addClass() { let element = document.getElementById(‘id1’); // 添加类 element.classList.add(‘beautify’); }
案例2:添加多个类在add()方法中添加多个类,用逗号分隔类 function addClass() { let element = document.getElementById(‘id1’); // 添加多个类 element.classList.add(‘class1’, ‘class2’, ‘class3’); }
方法 2 – 您还可以使用 className 属性向 HTML 元素添加类。
案例 1:覆盖预先存在的类 当您将新类分配给 className 属性时,它会覆盖以前的类。函数 addClass() { 让元素 = document.getElementById(‘id1’); // 添加多个类 element.className = ‘beautify’; }
案例 2:添加类而不覆盖 对类使用 += 运算符不覆盖以前的类。还要在新课前添加一个额外的空间。函数 addClass() { 让元素 = document.getElementById(‘id1’); // 添加单个多个类 element.className += ‘beautify’; // 添加多个类 element.className += ‘class1 class2 class3’; }
2.删除类
方法 1 – 从元素中删除类的最佳方法是 classList.remove() 方法。
案例1:删除单个类只需在方法中传递要从元素中删除的类名即可。函数 removeClass() { 让元素 = document.getElementById(‘id1’); // 移除类 element.classList.remove(‘beautify’); }
案例2:移除多个类传递多个类,用逗号隔开。函数 removeClass() { 让元素 = document.getElementById(‘id1’); // 移除类 element.classList.remove(‘class1’, ‘class2’, ‘class3’); }
方法 2 – 您还可以使用 className 方法删除类。
案例 1:删除单个类 如果元素只有 1 个类并且您想要删除它,那么只需将一个空字符串分配给 className 方法。函数 removeClass() { 让元素 = document.getElementById(‘id1’); // 移除类 element.className = ‘’; }
案例2:删除多个类如果元素有多个类,首先使用className属性从元素中获取所有类,然后使用replace方法将所需的类替换为空字符串,最后将其分配给元素的className属性。函数 removeClass() { 让元素 = document.getElementById(‘id1’); // 移除类 element.className = element.className.replace(‘class1’, ‘’); }
3.检查类
要检查元素中是否存在类,您可以简单地使用 classList.contains() 方法。如果类存在则返回 true,否则返回 false。
function checkClass() {
let element = document.getElementById('id1');
// checking class
if(element.classList.contains('beautify') {
alert('Yes! class exists');
}
}
4.切换类
要切换类,请使用 classList.toggle() 方法。
function toggleClass() {
let element = document.getElementById('id1');
// toggle class
element.classList.toggle('beautify');
}
答9:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
您也可以扩展 HTMLElement 对象,以添加方法来添加、删除、切换和检查类 (gist):
HTMLElement = typeof(HTMLElement) != 'undefiend' ? HTMLElement : Element;
HTMLElement.prototype.addClass = function(string) {
if (!(string instanceof Array)) {
string = string.split(' ');
}
for(var i = 0, len = string.length; i < len; ++i) {
if (string[i] && !new RegExp('(\\s+|^)' + string[i] + '(\\s+|$)').test(this.className)) {
this.className = this.className.trim() + ' ' + string[i];
}
}
}
HTMLElement.prototype.removeClass = function(string) {
if (!(string instanceof Array)) {
string = string.split(' ');
}
for(var i = 0, len = string.length; i < len; ++i) {
this.className = this.className.replace(new RegExp('(\\s+|^)' + string[i] + '(\\s+|$)'), ' ').trim();
}
}
HTMLElement.prototype.toggleClass = function(string) {
if (string) {
if (new RegExp('(\\s+|^)' + string + '(\\s+|$)').test(this.className)) {
this.className = this.className.replace(new RegExp('(\\s+|^)' + string + '(\\s+|$)'), ' ').trim();
} else {
this.className = this.className.trim() + ' ' + string;
}
}
}
HTMLElement.prototype.hasClass = function(string) {
return string && new RegExp('(\\s+|^)' + string + '(\\s+|$)').test(this.className);
}
然后像这样使用(单击将添加或删除类):
document.getElementById('yourElementId').onclick = function() {
this.toggleClass('active');
}
这是demo。
这个有点冗长...这是一个非常简洁的解决方案...jsfiddle.net/jdniki/UaT3P
抱歉@Jackson_Sandland 但你完全错过了重点,那就是根本不使用 jQuery。
答10:
huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。
只需添加来自另一个流行框架 Google Closures 的信息,请参阅他们的 dom/classes 类:
goog.dom.classes.add(element, var_args)
goog.dom.classes.addRemove(element, classesToRemove, classesToAdd)
goog.dom.classes.remove(element, var_args)
选择元素的一种方法是将 goog.dom.query 与 CSS 3 选择器一起使用:
var myElement = goog.dom.query("#MyElement")[0];
答11:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
对以前的正则表达式的一些小注释和调整:
如果类列表中的类名不止一次,您需要在全局范围内执行此操作。而且,您可能希望从类列表的末尾去除空格并将多个空格转换为一个空格,以防止出现空格。如果使用类名的唯一代码使用下面的正则表达式并在添加之前删除名称,那么这些事情都不会成为问题。但。好吧,谁知道谁可能会在班级名单上大吃一惊。
此正则表达式不区分大小写,因此在代码用于不关心类名大小写的浏览器之前,类名中的错误可能会出现。
var s = "testing one four one two";
var cls = "one";
var rg = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
var cls = "test";
var rg = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
var cls = "testing";
var rg = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
var cls = "tWo";
var rg = new RegExp("(^|\\s+)" + cls + "(\\s+|$)", 'ig');
alert("[" + s.replace(rg, ' ') + "]");
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式