如何用JavaScript更改元素的类? [英] How to change an element's class with JavaScript?

查看:145
本文介绍了如何用JavaScript更改元素的类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How can I change a class of an HTML element in response to an onClick event using JavaScript?

推荐答案

用于更改班级的现代HTML5技术



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

Modern HTML5 Techniques for changing classes

Modern browsers have added classList which provides methods to make it easier to manipulate classes without needing a library:

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,可从此页面。但是,越来越多的支持

Unfortunately, these do not work in Internet Explorer prior to v10, though there is a shim to add support for it to IE8 and IE9, available from this page. It is, though, getting more and more supported.

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

The standard JavaScript way to select an element is using document.getElementById("Id"), which is what the following examples use - you can of course obtain elements in other ways, and in the right situation may simply use this instead - however, going into detail on this is beyond the scope of the answer.

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

To replace all existing classes with one or more new classes, set the className attribute:

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

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

(You can use a space-delimited list to apply multiple classes.)

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

To add a class to an element, without removing/affecting existing values, append a space and the new classname, like so:

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



从元素中删除一个类:



要删除单个类到元素,而不影响其他可能的类,需要简单的正则表达式替换:

To remove a class from an element:

To remove a single class to an element, without affecting other potential classes, a simple regex replace is required:

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

这个正则表达式的解释如下:

An explanation of this regex is as follows:

(?:^|\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 标志te如果已经多次添加类名,则将替换为需要重复。

The g flag tells the replace to repeat as required, in case the class name has been added multiple times.

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

The same regex used above for removing a class can also be used as a check as to whether a particular class exists:

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


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

Whilst it is possible to write JavaScript directly inside the HTML event attributes (such as onclick="this.className+=' MyClass'") this is not recommended behaviour. Especially on larger applications, more maintainable code is achieved by separating HTML markup from JavaScript interaction logic.

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

The first step to achieving this is by creating a function, and calling the function in the onclick attribute, for example:

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

(脚本标签中不需要此代码,这是仅仅为了简洁起见,将JavaScript包含在一个不同的文件中可能更合适。)

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

The second step is to move the onclick event out of the HTML and into JavaScript, for example using 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可能不存在,因此该行将失败。)

(Note that the window.onload part is required so that the contents of that function are executed after the HTML has finished loading - without this, the MyElement might not exist when the JavaScript code is called, so that line would fail.)


以上代码全部采用标准JavaScript,但它很常见练习使用框架或库来简化常见任务,以及在编写代码时可能没有想到的修复错误和边缘情况。

The above code is all in standard JavaScript, however it is common practise to use either a framework or a library to simplify common tasks, as well as benefit from fixed bugs and edge cases that you might not think of when writing your code.

虽然有些人认为添加一个~50  KB框架来简单地改变一个类就太过分了,如果你正在做大量的JavaScript工作,或者任何可能有不寻常的跨浏览器行为的东西,那么值得考虑。

Whilst some people consider it overkill to add a ~50 KB framework for simply changing a class, if you are doing any substantial amount of JavaScript work, or anything that might have unusual cross-browser behaviour, it is well worth considering.

(非常粗略地说,库是为特定任务设计的一组工具,而fr是amework通常包含多个库并执行一整套职责。)

上面的示例已使用 jQuery ,可能是最常用的JavaScript库(虽然还有其他一些值得研究)。

The examples above have been reproduced below using jQuery, probably the most commonly used JavaScript library (though there are others worth investigating too).

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

(Note that $ here is the jQuery object.)

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

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

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

此外,jQuery提供了一个快捷方式,用于添加一个类,如果它不适用,或者删除一个类:

In addition, jQuery provides a shortcut for adding a class if it doesn't apply, or removing a class that does:

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


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

或者,无需ID:

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


这篇关于如何用JavaScript更改元素的类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆