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 相关文章推荐
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
Jan 08 Javascript
浅谈js中的闭包
Mar 16 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
Nov 17 Javascript
js 轮播效果实例分享
Dec 28 Javascript
微信小程序 下拉列表的实现实例代码
Mar 08 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
Apr 17 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
Sep 29 Javascript
node省市区三级数据性能测评实例分析
Nov 06 Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 Javascript
vue+axios全局添加请求头和参数操作
Jul 24 Javascript
微信小程序自定义tabBar的踩坑实践记录
Nov 06 Javascript
处理canvas绘制图片模糊问题
May 11 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
德生PL990的分析评价
2021/03/02 无线电
Linux安装配置php环境的方法
2016/01/14 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
使用ltrace工具跟踪PHP库函数调用的方法
2016/04/25 PHP
PhpStorm本地断点调试的方法步骤
2018/05/21 PHP
php微信开发之谷歌测距
2018/06/14 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript 常用关键字列表集合
2007/12/04 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
js读取cookie方法总结
2014/10/31 Javascript
Jquery 实现table样式的设定
2015/01/28 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
C++是不是类型安全的
2014/02/18 面试题
GWT都有什么特性
2016/12/02 面试题
班组长工作职责
2013/12/25 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
节能环保口号
2014/06/12 职场文书
县政协领导班子群众路线教育实践活动四风问题整改方案
2014/10/26 职场文书
2014年手术室工作总结
2014/11/26 职场文书
PHP实现两种排课方式
2021/06/26 PHP
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL