JavaScript更改class和id的方法


Posted in Javascript onOctober 10, 2008

是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 相关文章推荐
Javascript 同时提交多个Web表单的方法
Feb 19 Javascript
jquery keypress,keyup,onpropertychange键盘事件
Jun 25 Javascript
Jquery对象和Dom对象的区别分析
Nov 20 Javascript
sails框架的学习指南
Dec 22 Javascript
js识别uc浏览器的代码
Nov 06 Javascript
解读Bootstrap v4 sass设计
May 29 Javascript
AngularJS基础 ng-dblclick 指令用法
Aug 01 Javascript
Vue2路由动画效果的实现代码
Jul 10 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
Oct 12 Javascript
用vue写一个仿简书的轮播图的示例代码
Mar 13 Javascript
微信小程序基于高德地图查找位置并显示文字
Oct 30 Javascript
Vue快速实现通用表单验证的方法
Feb 24 Javascript
ppk谈JavaScript style属性
Oct 10 #Javascript
用javascript getComputedStyle获取和设置style的原理
Oct 10 #Javascript
执行iframe中的javascript方法
Oct 07 #Javascript
JS版网站风格切换实例代码
Oct 06 #Javascript
判断JavaScript对象是否可用的最正确方法分析
Oct 03 #Javascript
IE与firefox之jquery用法区别
Oct 03 #Javascript
jquery的颜色选择插件实例代码
Oct 02 #Javascript
You might like
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
jQuery 表单验证扩展(四)
2010/10/20 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
JavaScript中this的学习笔记及用法整理
2020/02/17 Javascript
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
Python编程入门的一些基本知识
2015/05/13 Python
python函数装饰器用法实例详解
2015/06/04 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
Python collections模块使用方法详解
2019/08/28 Python
解析python实现Lasso回归
2019/09/11 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
Python requests获取网页常用方法解析
2020/02/20 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
Django中的AutoField字段使用
2020/05/18 Python
大三在校生电子商务求职信
2013/10/29 职场文书
体育老师的教学自我评价分享
2013/11/19 职场文书
海南地接欢迎词
2014/01/14 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
安全演讲稿大全
2014/05/09 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
详细总结Python常见的安全问题
2021/05/21 Python
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
python_tkinter事件类型详情
2022/03/20 Python
Python os和os.path模块详情
2022/04/02 Python
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android