<ulid="main"> <li>走在前方不迷路,迷路就去找麋鹿</li> <li>走在前方不迷路,迷路就去找麋鹿</li> <li>走在前方不迷路,迷路就去找麋鹿</li> <li>走在前方不迷路,迷路就去找麋鹿</li> </ul> <script> var main = document.getElementById("main"); var lst = main.getElementsByTagName("li"); for (var i = 0; i < lst.length; i++) { var el = lst[i]; if (i % 2 == 0) { el.style.background = "lightblue"; } else { el.style.background = "lightgreen"; } } </script>
错误示范
在 for 循环里添加如下代码(添加在尾部)
这里希望 oldColor 保存每一个 li 鼠标滑上之前的颜色
1 2 3 4 5 6 7 8 9
var oldColor = el.style.background; el.onmouseover = function () { // 鼠标滑上变色 this.style.background = "green"; }; el.onmouseout = function () { // 鼠标离开之后恢复原色 this.style.background = oldColor; };
测试一下效果,发现出现如下问题:鼠标滑过,所有 li 都变成最后一行 li 的颜色
剖析一下问题所在
首先 for 循环会先执行一遍,并给每一个 li 添加鼠标滑上和离开事件,当鼠标滑上或离开时,此时 for 循环已经结束,此时调用的是每一个 li 已经添加上的事件。循环结束后 oldColor 已经变成最后一个 li 的颜色,所以触发离开事件更改的颜色永远是最后一个 li 的颜色,因此会出现如上问题
问题示范
与上面的问题,区别只在于奇偶行在赋值颜色时,是通过类添加的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<style> .color1 { background: lightblue; } .color2 { background: lightgreen; } </style> <script> var main = document.getElementById("main"); var lst = main.getElementsByTagName("li"); for (var i = 0; i < lst.length; i++) { if (i % 2 == 0) { lst[i].style.background = "lightblue"; } else { lst[i].style.background = "lightgreen"; } } </script>
在 for 循环里添加如下代码(添加在尾部),发现这个效果是正常的
1 2 3 4 5 6 7
var oldColor = lst[i].style.background; lst[i].onmouseover = function () { this.style.background = "green"; }; lst[i].onmouseout = function () { this.style.background = oldColor; };
但是有一些问题
var oldColor = el.style.background 这个只能获取行内样式
但是如上代码是通过添加类的方法去设置 li 的颜色,使用 style 属性没办法获取,所以 oldColor 实际存储的是一个空字符串。因此,鼠标滑上实际上是给 li 添加行内式代码,鼠标离开后,把行内代码变为 “” 去掉,就相当于没添加效果,此时采用的是内嵌样式(也是就通过类名添加的样式)
正确方法
方法一:给 this 添加新属性
给每个 li 上添加一个 bgColor 属性,鼠标离开时,只需访问这个 bgColor 查到值,恢复原有颜色即可