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 相关文章推荐
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
May 10 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
Dec 17 Javascript
zTree插件之单选下拉菜单实例代码
Nov 07 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
Dec 11 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
Apr 16 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
Apr 10 jQuery
bootstrap手风琴折叠示例代码分享
May 22 Javascript
AngularJS中控制器函数的定义与使用方法示例
Oct 10 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
Dec 02 Javascript
微信小程序去除左上角返回键的实现方法
Mar 06 Javascript
浅谈vue的第一个commit分析
Jun 08 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
Nov 20 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
jquery链式操作的正确使用方法
2014/01/06 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
详解JavaScript函数
2015/12/01 Javascript
js倒计时简单实现方法
2015/12/17 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
Python with的用法
2014/08/22 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
利用pyecharts实现地图可视化的例子
2019/08/12 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
物业保安员岗位职责制度
2014/01/30 职场文书
函授本科个人自我鉴定
2014/03/25 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript
图神经网络GNN算法
2022/05/11 Python
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL