今天我在学习jQuery的addClass操做时遇到了一个小问题,想来跟你们分享一下,避免初学者踩坑。javascript
个人需求是制做一个表格,并让它隔行换色,在此基础上再加上鼠标悬浮变色的效果。(主要训练jQuery选择器和addClass)css
可是在我真正操做后发现个人奇数行都变色了,而偶数行都没有变。具体效果以下:java
原效果:学习
咱们能够看到首行为一种颜色,奇数行无颜色,偶数行设置了背景颜色测试
鼠标悬浮在第一行的效果:字体
这里能够观察到“梅西”一行变换了颜色this
鼠标悬浮在第二行的效果:spa
到了这里就发生了异常,整个表格竟然没有发生变化code
接下来我将放上个人源代码,你们能够先观察一下是哪里出现了错误。blog
jQuery相关源码:
<script type="text/javascript"> $(function(){ //全选全不选 $("#thch").click(function(){ var ch = $("#thch").prop("checked"); $("#tabl td input").prop("checked",ch); }) //表格隔行换色 $("table tr:gt(0):odd").addClass("even") //鼠标悬浮变色 $("table tr:gt(0)").mouseover(function(){ $(this).addClass("mv") }) $("table tr:gt(0)").mouseleave(function(){ $(this).removeClass("mv") }) $("table tr:gt(0)").click(function(){ var self = $(this) var a = $("this input").prop("checked") }) }) </script>
css相关代码:
#tabl{ width: 600px; height: 200px; margin-top: 200px; text-align: center; } .tr1{ background-color: cornflowerblue; color: white; } .mv{ background-color: rosybrown; } .even{ background-color: antiquewhite; }
因为我表格给奇数行先添加了一个even的css样式,在处罚鼠标悬浮事件后的添加的mv的css样式并无生效,因此当时我首先想到的是addClass这个方法是否在添加过一次css样式后,再次添加时只在第一次添加的样式后边寻找,因为个人.even是写在.mv后的,因此没有找到。
为了测试个人上述所想,我便进行了测试,在.mv中添加一个font-size的属性,测试是否生效,测试结果以下:
能够清楚的看到字体变大了,然而颜色依旧没有变。
这就让我感到了更加困惑,问了一些同窗也没有获得我想要的答案,因为天色已晚,我也没有什么思路,就暂时放下了这道题。次日一早我在吃饭时忽然想到是否与css的加载顺序有关,便匆忙的赶去验证个人想法。
我将.mv与.even互换了位置,效果以下:
此次终于对了!!!
在改对以后我便仔细去查了一下addClass的原理,它并非将标签上原本就有的css样式覆盖,而是添加css,因此它也遵循css样式的加载顺序,一开始时.mv在.even的前边,因此要加载后边的样式,然然后边的样式仍是.even,因此没有变换,将他们两个互换顺序后就能够看到变换了。
总结:
在使用addClass方法时,并非将原有的css样式覆盖,而是将标签添加上css样式,添加后的加载与css文件中的顺序有关,也就是后写的覆盖前边的。