如何更改HTML元素的类以响应 onClick
使用JavaScript的事件?
如何更改HTML元素的类以响应 onClick
使用JavaScript的事件?
现代浏览器增加了 班级名册 它提供了一些方法,可以在不需要库的情况下更轻松地操作类:
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
如果已多次添加类名,则flag会根据需要告知replace重复。
上面用于删除类的相同正则表达式也可用于检查特定类是否存在:
if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )
虽然可以直接在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,但是通常的做法是使用框架或库来简化常见任务,以及从编写代码时可能没有想到的修复错误和边缘情况中获益。
虽然有些人认为添加一个~50 KB的框架来简单地改变一个类是不合适的,如果你正在做大量的JavaScript工作,或者任何可能有不寻常的跨浏览器行为的东西,那么值得考虑。
(非常粗略地说,库是为特定任务设计的一组工具,而框架通常包含多个库并执行一整套职责。)
以下使用以下示例复制了上述示例 jQuery的,可能是最常用的JavaScript库(虽然还有其他值得研究)。
(注意 $
这是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);
你也可以这样做:
的document.getElementById( 'ID')classList.add( '类')。 的document.getElementById( 'ID')classList.remove( '类')。
并切换一个类(如果存在则删除,否则添加它):
。的document.getElementById( '编号')classList.toggle( '类');
在我没有使用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。
哇,惊讶于这里有太多的矫枉过正的答案......
<div class="firstClass" onclick="this.className='secondClass'">
使用纯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);
}
}
这对我有用:
function setCSS(eleID) {
var currTabElem = document.getElementById(eleID);
currTabElem.setAttribute("class", "some_class_name");
currTabElem.setAttribute("className", "some_class_name");
}
你也可以扩展HTMLElement对象,以便添加添加,删除,切换和检查类的方法(要旨):
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');
}
这是 演示。
只是为了添加来自其他流行框架的信息,Google Closures,请参阅他们的 DOM /班 类:
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];
以前的正则表达式上的一些小注释和调整:
如果类列表具有多次类名,您将希望全局执行此操作。而且,您可能希望从类列表的末尾删除空格并将多个空格转换为一个空格以防止空格的运行。如果使用类名称的唯一代码使用下面的正则表达式并在添加之前删除名称,则这些都不应该成为问题。但。好吧,谁知道谁可能会在班级名单上加油。
此正则表达式不区分大小写,因此在不关心类名称中的大小写的浏览器上使用代码之前,类名中的错误可能会显示出来。
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, ' ') + "]");
使用JavaScript更改元素的CSS类 ASP.NET:
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