当前位置:  开发笔记 > 编程语言 > 正文

如何用JavaScript更改元素的类?

如何解决《如何用JavaScript更改元素的类?》经验,为你挑选了17个好方法。

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



1> Peter Bought..:

用于更改类的现代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中不起作用,尽管有一个垫片可以添加对IE8和IE9的支持,可以从这个页面获得.但是,它越来越受到支持.

简单的跨浏览器解决方案

选择元素的标准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 end of string or a space)

如果g已多次添加类名,则该标志告诉replace按要求重复.

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

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

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


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

虽然可以直接在HTML事件属性(例如onclick="this.className+=' MyClass'")中编写JavaScript,但这不是推荐的行为.特别是在较大的应用程序上,通过将HTML标记与JavaScript交互逻辑分离,可以实现更易维护的代码.

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


...

(不需要在脚本标记中包含此代码,这仅仅是为了简洁示例,并且在不同的文件中包含JavaScript可能更合适.)

第二步是将onclick事件从HTML移到JavaScript中,例如使用addEventListener


...

(请注意,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为click事件分配函数:

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

或者,不需要id:

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



伟大的回答彼得.一个问题......为什么用JQuery比用Javascript更好**?JQuery很棒,但是如果这就是你需要做的 - 包括整个JQuery库而不是几行JavaScript的理由是什么?
如果你试图删除一个类'myClass'并且你有一个类'prefix-myClass'你上面给出的用于删除类的正则表达式将在你的className中留下'prefix-':O
此解决方案的一个错误:当您多次单击按钮时,它会多次向元素添加"MyClass"类,而不是检查它是否已存在.因此,您最终可能会看到类似这样的HTML类属性:`class ="button MyClass MyClass MyClass"`
@mattstuehler 1)短语"better yet x"**经常表示"更好(你可以)x".2)为了解决问题的核心,jQuery旨在帮助访问/操作DOM,并且通常如果你需要在整个地方完成这些操作时需要这样做.
哇,三年和183个赞成,直到现在还没有人发现.谢谢jinglesthula,我已经纠正了正则表达式,因此它不会错误地删除部分类名.//我想这是一个很好的例子,为什么一个框架(比如jQuery)值得使用 - 像这样的错误会被更快地捕获并修复,并且不需要更改普通代码.
我想解决方法是:`if(!document.getElementById("MyElement").className.match(/(?:^ |\s)MyClass(?!\ S)/))`或者,用jQuery :`if(!$ j('#MyElement').hasClass('MyClass'))`(虽然我怀疑addClass不会添加重复项?)
在添加类名称的情况下,在您要添加的类名称前面有空格.
当与类名我不得不寻找语法的变量,以形成正则表达式:`VAR正则表达式=新的RegExp( '(?:^ | \\ S)' + classToAddOrRemove + '?!(\\ S)', 'G');`
我刚刚对这个答案做了大量补充 - 批量是一样的,但如果有任何错误或进一步改进的地方,我会很感激.
我做了一些小的改编以改善答案 - 希望人们同意他们是改进?如果还有其他任何我错过的让我知道(或者只是自己编辑答案).
@PeterBoughton不确定你认为这是一个改进,但我喜欢:`(''+ document.getElementById("MyElement").className +'').replace(''+ MyClass +'','')`
我使用类似的方法,但使用ag(一般)正则表达式.原因正好是@Web_Designer上面描述的问题:如果用户多次点击,您最终会得到同一个类的多个实例,并且必须删除所有实例才能删除该类.
这里缺少的一个重要细节是框架和库之间的区别.jQuery是一个库,而不是一个框架.仅为了示例的安全,例如,框架将是angularJs.
_(您可以指定以空格分隔的元素列表.)_您必须表示要分配的类列表,而不是要选择的元素.
\ b匹配连字符旁边.

2> Tyilo..:

你也可以这样做:

document.getElementById('id').classList.add('class');
document.getElementById('id').classList.remove('class');

并切换一个类(删除,如果存在,否则添加它):

document.getElementById('id').classList.toggle('class');


我相信这是HTML5依赖.
[Mozilla开发者网络](https://developer.mozilla.org/en-US/docs/DOM/element.classList)声明它在本地使用不到10的Internet Explorers中工作.我找到了声明在我的测试中是真的.显然,Internet Explorer 8-9需要[Eli Gray shim](http://eligrey.com).不幸的是,我在他的网站上找不到它(即使是搜索).Mozilla链接上提供了垫片.
你需要Eli Gray的`classList`垫片.
atow"classList"在IE10 +中有部分支持; 不支持Opera Mini; 其他标准浏览器完全支持:http://caniuse.com/#search=classlist

3> Andrew Orsic..:

在我没有使用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添加一些类,我可以使用这个按钮:


...

到目前为止,肯定会更好地使用jQuery.


当您的客户端不允许您使用jQuery时,这非常有用.(因为你最终几乎建立了自己的图书馆.)
@kfrncs因为我一般不需要那么庞大的框架.对于我想到的项目,我需要的唯一函数是3个classname(has,add,remove)函数和cookie(has,add,remove)函数.其他一切都是定制的,或者本机支持得很好.因此,在缩小之前,所有东西一共只有150行,包括评论.

4> Eric Wendeli..:

您可以这样使用node.className:

document.getElementById('foo').className = 'bar';

根据PPK,这应该适用于IE5.5及更高版本.


这将覆盖对象上的任何和所有其他类...所以它不是那么简单.

5> PseudoNinja..:

使用纯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);
    }
}



6> Travis J..:

哇,惊讶于这里有太多的矫枉过正的答案......


我不同意,因为我认为示例代码应该树立一个很好的例子.
我会说不引人注目的javascript是编写示例代码的可怕做法......
其他答案并不过分,他们还会在元素上保留现有的类.

7> Gopal Krishn..:

这对我有用:

function setCSS(eleID) {
    var currTabElem = document.getElementById(eleID);

    currTabElem.setAttribute("class", "some_class_name");
    currTabElem.setAttribute("className", "some_class_name");
}



8> moka..:

你也可以扩展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');
}

这是演示.


对不起@Jackson_Sandland,但你完全错过了这一点,完全不使用jQuery.

9> Ben Flynn..:

只是为了添加来自其他流行框架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和CSS3选择器:

var myElement = goog.dom.query("#MyElement")[0];



10> Alex Robinso..:

以前的正则表达式上的一些小注释和调整:

如果类列表具有多次类名,您将希望全局执行此操作.并且,您可能希望从类列表的末尾删除空格并将多个空格转换为一个空格以防止空格的运行.如果使用类名称的唯一代码使用下面的正则表达式并在添加之前删除名称,则这些都不应该成为问题.但.好吧,谁知道谁可能会在课程名单上加油.

此正则表达式不区分大小写,因此在不关心类名称中的大小写的浏览器上使用代码之前,类名中的错误可能会显示出来.

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, ' ') + "]");



11> 小智..:

在ASP.NET中使用JavaScript更改元素的CSS类:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        lbSave.Attributes.Add("onmouseover", "this.className = 'LinkButtonStyle1'")
        lbSave.Attributes.Add("onmouseout", "this.className = 'LinkButtonStyle'")
        lbCancel.Attributes.Add("onmouseover", "this.className = 'LinkButtonStyle1'")
        lbCancel.Attributes.Add("onmouseout", "this.className = 'LinkButtonStyle'")
    End If
End Sub



12> shingokko..:

我会使用jQuery并写这样的东西:

jQuery(function($) {
    $("#some-element").click(function() {
        $(this).toggleClass("clicked");
    });
});

此代码添加了在单击id some元素的元素时要调用的函数.该函数将点击该元素的class属性,如果它不是已经是它的一部分,如果它的存在,删除它.

是的,您确实需要在页面中添加对jQuery库的引用以使用此代码,但至少您可以确信库中的大多数函数可以在几乎所有现代浏览器上运行,并且它将节省您实施的时间你自己的代码做同样的事情.

谢谢


你只需要用长形式编写`jQuery`一次.`jQuery(function($){});`在所有情况下``使`$`在函数内可用.

13> 小智..:

这条线

document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace(/\bMyClass\b/','')

应该:

document.getElementById("MyElement").className = document.getElementById("MyElement").className.replace('/\bMyClass\b/','');


不正确.RegEx被正斜杠所取代.添加引号会导致它在IE中失败,返回您尝试删除的类的字符串,而不是实际删除该类.

14> 小智..:

这是我的版本,完全正常工作:

function addHTMLClass(item, classname) {
    var obj = item
    if (typeof item=="string") {
        obj = document.getElementById(item)
    }
    obj.className += " " + classname
}

function removeHTMLClass(item, classname) {
    var obj = item
    if (typeof item=="string") {
        obj = document.getElementById(item)
    }
    var classes = ""+obj.className
    while (classes.indexOf(classname)>-1) {
        classes = classes.replace (classname, "")
    }
    obj.className = classes
}

用法:



如果你试图删除类`foo`,那将破坏类`foobar`.内部事件处理程序属性中的JS在编辑之前已被破坏.4岁的接受答案要好得多.

15> kofifus..:

这是一个toggleClass来切换/添加/删除元素上的类:

// If newState is provided add/remove theClass accordingly, otherwise toggle theClass
function toggleClass(elem, theClass, newState) {
    var matchRegExp = new RegExp('(?:^|\\s)' + theClass + '(?!\\S)', 'g');
    var add=(arguments.length>2 ? newState : (elem.className.match(matchRegExp) == null));

    elem.className=elem.className.replace(matchRegExp, ''); // clear all
    if (add) elem.className += ' ' + theClass;
}

见jsfiddle

另请参阅我在这里动态创建新类的答案



16> Eugene Tiuri..:
使用IE6支持更改vanilla JavaScript中的元素类

您可以尝试使用node attributes属性来保持与旧浏览器的兼容性,即使是IE6:

function getClassNode(element) {
  for (var i = element.attributes.length; i--;)
    if (element.attributes[i].nodeName === 'class')
      return element.attributes[i];
}

function removeClass(classNode, className) {
  var index, classList = classNode.value.split(' ');
  if ((index = classList.indexOf(className)) > -1) {
    classList.splice(index, 1);
    classNode.value = classList.join(' ');
  }
}

function hasClass(classNode, className) {
  return classNode.value.indexOf(className) > -1;
}

function addClass(classNode, className) {
  if (!hasClass(classNode, className))
    classNode.value += ' ' + className;
}

document.getElementById('message').addEventListener('click', function() {
  var classNode = getClassNode(this);
  var className = hasClass(classNode, 'red') && 'blue' || 'red';

  removeClass(classNode, 'red');
  removeClass(classNode, 'blue');

  addClass(classNode, className);
})
.red {
  color: red;
}
.red:before {
  content: 'I am red! ';
}
.red:after {
  content: ' again';
}
.blue {
  color: blue;
}
.blue:before {
  content: 'I am blue! '
}
Click me


17> Salman A..:

我在代码中使用以下vanilla JavaScript函数.它们使用正则表达式,indexOf但不要求在正则表达式中引用特殊字符.

function addClass(el, cn) {
    var c0 = (" " + el.className + " ").replace(/\s+/g, " "),
        c1 = (" " + cn + " ").replace(/\s+/g, " ");
    if (c0.indexOf(c1) < 0) {
        el.className = (c0 + c1).replace(/\s+/g, " ").replace(/^ | $/g, "");
    }
}

function delClass(el, cn) {
    var c0 = (" " + el.className + " ").replace(/\s+/g, " "),
        c1 = (" " + cn + " ").replace(/\s+/g, " ");
    if (c0.indexOf(c1) >= 0) {
        el.className = c0.replace(c1, " ").replace(/\s+/g, " ").replace(/^ | $/g, "");
    }
}

您还可以在现代浏览器中使用element.classList.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有