來源:http://www.jb51.net/article/16131.htm

JavaScript允许你更改元素的class或id。当你更改之后,浏览器会自动更新元素的样式。
是className,可不是class

注意JavaScript使用的是className去访问class属性,因为class是一个保留关键字,因为将来JavaScript可能开始支持像Java一样的类。
我们在讨论style属性时遇到了棘手的细节问题和浏览器差异性带来的麻烦,正如同经历一场惊涛骇浪。而class和id的更改则像是沙漠里一片平静的绿洲,浏览器们在这里和谐相处。思考这个例子:
p {
color: #000000; /* black */
}
p.emphasis {
color: #cc0000; /* red */
}
<p id="test">Test</p>
最初,该段落没有定义class,所以它的字体颜色是黑色。不过,一行JavaScript就足以改变它的样式:
document.getElementById('test').className = 'emphasis';
瞬间文字变成了红色。如果想要改变回来,你可以按如下操作:
document.getElementById('test').className = '';
你移除了样式,该段落恢复到默认的p{}规则。
对于一个实际应用中的例子,看看“限长的文本输入区”。计数器有这样的结构和呈现样式(该结构由JavaScript动态生成,不过那不影响这个例子):
<div class="counter"><span>12</span>/1250</div>
div.counter {
font-size: 80%;
padding-left: 10px;
}
span.toomuch {
font-weight: 600;
color: #cc0000;
}
当脚本发现用户输入的文字一定达到了最大长度,它修改作为计数器的<span>的class为toomuch:
[限长的文本输入区,第20~23行]
if (currentLength > maxLength)
this.relatedElement.className = 'toomuch';
else
this.relatedElement.className = '';
现在,作为计数器的<span>字体变成粗体和红色。
id的变更以几乎完全一样的方式工作:
p {
color: #000000; /* black */
}
p#emphasis {
color: #cc0000; /* red */
}
<p>Test</p>
document.getElementsByTagName('p')[0].id = 'emphasis';
该段落的文字再次变成了红色。但是,我建议你不要过多改变id。除了作为CSS的钩子,它们也常常作为JavaScript的钩子,改变它们可能存在不确定的副作用。
增加class
通常,你不会给一个元素的class设置新值,而只是添加一个class。因为你不希望移除元素已经拥有的任何样式。因为CSS允许复合样式,新class所包含的样式被添加到元素上,不会移除任何已经存在的class的CSS指令。
“表 单验证”中的writeError()和removeError()函数是一个很好的例子。一般来说我会给表单域应用好几个class,因为图形设计师经 常对输入框使用两个甚至三个宽度。当一个表单域包含错误的时候,我希望添加一个特别的警告样式,但我不希望搅乱该元素已经拥有的样式。所以,我不能简单地 覆盖旧的class值,那样我将失去已经指定的宽度。
看这样的情形:
<input class="smaller" name="name" />
input.smaller {
width: 75px;
}
input.errorMessage {
border-color: #cc0000;
}
最开始,输入框的宽度是75px。如果脚本设置class为'errorMessage'并且删除旧值,表单域会得到一个红色的边框,但也失去了它的宽度,而那样的话可能会让用户感到非常迷惑。
因此,我是添加了errorMessage class:
[表单验证,第105~106行]
function writeError(obj,message) {
obj.className += ' errorMessage';
这 段代码取得已存在的className并在其后附加一个新的class,在它之前加一个空格。这个空格分隔新的class和任何对象可能已经拥有的 class值。现在输入框除了拥有75px宽度之外,如我们所愿地得到了红色边框。该表单域现在应用了两个class,HTML就好像这样:
<input class="smaller errorMessage" name="name" />
Class在Mozilla中的名称与空白
你 可能注意到removeError()移除class的值errorMessage的时候没有前置的空格。那是因为一个浏览器的bug。当你添加 errorMessage到一个原来没有值的class的时候,Mozilla会删除前置空格。如果我们随后执行replace(/ errorMessage/,''),Mozilla不能移除class,它找不到字符串errorMessage,因为前置空格已经不在了。
移除class
一旦用户修正了她的错误,class的值errorMessage应该被移除,但任何原来的class,比如smaller,不应该受到影响。removeError()函数提供了这个功能:
[表单验证,第119~120行]
function removeError() {
this.className = this.className.replace(/errorMessage/,'');
它先取得元素的class然后替换字符串'errorMessage'为''(一个空字符)。errorMessage从class的值中被取走,但对其他的值没有影响。表单域失去了红色的边框颜色,但依然维持75px的宽度。

JavaScript更改class和id的方法相关推荐

  1. 如何使用JavaScript更改元素的类?

    如何使用JavaScript更改HTML元素的类以响应onclick事件? #1楼 对以前的正则表达式的一些小注释和调整: 如果班级列表中的班级名称不止一次,您将希望在全局范围内执行此操作. 而且,您 ...

  2. 什么是在JavaScript中扩展错误的好方法?

    本文翻译自:What's a good way to extend Error in JavaScript? I want to throw some things in my JS code and ...

  3. mysql自动生成id方式_Mysql全局ID生成方法

    本文给大家介绍mysql全局id生成方法,涉及到mysql全局id相关知识,感兴趣的朋友一起学习吧 生产系统随着业务增长总会经历一个业务量由小变大的过程,可扩展性是考量数据库系统高可用性的一个重要指标 ...

  4. JavaScript 获得对象的N种方法 [转]

    JavaScript 获得对象的N种方法 [转] 方法如下: document.getElementById(ID)        //获得指定ID值的对象 document.getElementsB ...

  5. dedecms修改文章ID_织梦DEDECMS系统修改文章ID的方法

    dedecms是不支持网站后台直接更改文章ID的,如果想要修改dedecms的文章ID,或是叫织梦DEDECMS系统修改文章ID的方法,小编就把具体方法分享给大家:  目前最新是V5.7版,只能通过修 ...

  6. js获取id后添加html代码,js获取Id的方法getElementById与$的由来和用Id判断元素是否存在及批量动态获取 Id...

    要用js操作一个html元素必须获取到这个元素,而获取元素要用 getElementById() 方法,这个方法是通过元素的Id获取到元素这个对象.getElementById 字符比较多,写得比较长 ...

  7. html插入地图的方法,JavaScript接入百度地图API的方法步骤

    一.百度地图API接入 1.搜索百度地图开发平台 2.注册百度账号 3.登陆并申请成为开发者 4.在百度地图开发平台的首页选择控制台,在控制台中创建应用 创建好应用以后就能在控制台我的应用中看到这个应 ...

  8. php拼图游戏开发,原生javascript制作的拼图游戏实现方法详解

    本文实例讲述了原生javascript制作的拼图游戏实现方法.分享给大家供大家参考,具体如下: 实现方法 //1.让所有的li(在ul里)可以拖拽 //2.交换li的位置  计算背景图位置 //1.让 ...

  9. 复制链接到剪切板php,JavaScript实现复制到剪贴板的方法总结

    在我们日常开发工作中,我们会经常用到粘贴复制这个功能,很多时候我们项目中也会出现让你实现复制到剪贴板的功能,下面我们就给大家介绍下JavaScript实现复制到剪贴板的方法总结! 一.实现点击按钮,复 ...

最新文章

  1. window 服务(二)
  2. 【转】 ASP.NET 3.5中使用新的ListView控件
  3. 【OpenCV3】角点检测——cv::goodFeaturesToTrack()与cv::cornerSubPix()详解
  4. with as 用法_介词with用法
  5. 软件测试作业1 -- 关于c++项目中类相互调用的问题与解决
  6. 【C++ Priemr | 15】派生类向基类转换的可访问性
  7. 红帽子linux生效环境变量,RedHat Linux 5无法使用ifconfig的解决方法
  8. __name__ == '__main__'
  9. 拳王虚拟项目公社:虚拟资源如何挣钱,小白月入过万的操作思路
  10. HTTP协议:GET请求
  11. c++ vector 赋值_数据分析:R篇 | 变量赋值、计算、画图、基本检验
  12. 无法为类型 CuteEditor.Editor 授予有效的许可证。
  13. 无需无线路由,将系统为win7的笔记本变成wifi的方法
  14. 通讯工程考研考计算机专业跨度大么,通信工程专业,与自动化专业差别大吗?考研可以跨考吗?...
  15. php 降低视频分辨率,怎么看视频的分辨率 如何改变视频分辨率|视频分辨率修改器...
  16. 房产中介管理系统网站完整源码
  17. 什么是CGCS2000坐标系
  18. 高数笔记(四):导数概念,函数的求导法则,高阶导数,隐函数求导、参数方程求导
  19. 驱动里面如何操作regulator
  20. 风袖使用RocketMQ实现订单状态转变

热门文章

  1. Android—多版本主要适配内容
  2. 从服务器检索时出错dfdferh01_大数据实战项目之海量人脸特征检索解决方案演进...
  3. cd : cannot create temp file for here-document: No space left on device
  4. android获取本地图片后缀,Android向图片文件添加扩展信息EXIF如地点,时间,人物等...
  5. 菜鸟教程python3 mysql_MySQL 教程
  6. 积累bootstrap的一些知识
  7. python实现傅里叶变换求幅值和相位_Python 实现图像快速傅里叶变换和离散余弦变换...
  8. 切换activity的动画效果
  9. python arp攻击_ARP欺骗——用Python实现道德黑客攻击的自动化
  10. 利用QCommonStyle绘制自定义的窗体部件