this.style.background="purple";的this换成li[i]为什么就不行了

this.style.background="purple";的this换成li[i]为什么就不行了

<!DOCTYPE html>

<html>


<head>

    <title></title>

    <style type="text/css">

    html,

    body {

        margin: 0;

        padding: 0;

    }


    div:not(:nth-of-type(2)) {

        width: 500px;

        height: 100%;

        background-color: #a0e4ff;

        margin: 0 auto;

    }

    /*ul默认有外边距*/


    ul {

        width: 300px;

        height: 100%;

        background-color: #ecc7ea;

        list-style: none;

        /*清除默认边距*/

        margin: 0;

        padding: 0;

        margin: 20px auto;

        margin-bottom: 30px;

    }


    li {

        width: 200px;

        height: 30px;

        line-height: 30px;

        margin: 30px auto;

        background-color: #cdffc0;

    }

    </style>

</head>


<body>

    <div id="box">

        <button id="btnAdd">添加元素</button>

        <button id="btnRemove">删除元素</button>

        <ul id="list">我是ul

            <li>我是li1</li>

            <li>我是li2</li>

            <li>我是li3</li>

        </ul>

    </div>

    <script type="text/javascript">

      var lit=document.getElementById("list"),

          li=lit.children,

          bta=document.getElementById("btnAdd"),

          btr=document.getElementById("btnRemove");

      // li[1].style.background="purple";

      for(var i=0;i<li.length;i++){

        li[i].onmouseover=function(){

          this.style.background="purple";

        }

        li[i].onmouseout=function(){

          this.style.background="pink";

        }

      }

      bta.onclick=function(){

        var nli=document.createElement("li"),

            ntxt=document.createTextNode("我是li"+(li.length+1));

        nli.appendChild(ntxt);

        lit.appendChild(nli);

      }

      btr.onclick=function(){

        lit.removeChild(lit.lastElementChild);

      }

    </script>

</body>


</html>


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,for循环是在触发移入移出事件之前就执行完了,在移入移出事件里面打印i值,是循环之后的值,也就是3,可以打印看下:
http://img1.sycdn.imooc.com//climg/5e82ffa80967bf9906230150.jpg

控制台:

http://img1.sycdn.imooc.com//climg/5e82ffb7094bb8af02100134.jpg

页面中并没有索引为3的li 元素,所以会报错。同学可以再理解下。祝学习愉快~

  • 慕慕4335856 提问者 #1
    谢谢老师,明白了
    2020-03-31 16:44:01
好帮手慕言 2020-03-31 11:29:54

同学你好,页面打开时,代码顺序执行。for循环很快执行完毕,当i=3时,不满足条件退出循环。而事件在页面打开时并不会执行,只有当我们用鼠标移入元素触发事件,里面的代码才会执行。即当事件中执行li[i]时(注意上面说的i=3),页面中并没有索引为3的li 元素,所以会报错。建议同学用this就行。

关于同学的代码:当把所有元素删除完之后,再点击“删除元素”按钮,会有报错,如下:
http://img1.sycdn.imooc.com//climg/5e82b890096c10c019050091.jpg

是因为没有子元素了,继续移除就会出错,可以提前添加判断,如下:

http://img1.sycdn.imooc.com//climg/5e82b8ef09a611dc06000197.jpg

如果我的回答帮到了你,欢迎采纳,祝学习愉快~

  • 提问者 慕慕4335856 #1
    老师,关于li[i]的问题我还是没懂 for(var i=0;i<li.length;i++){}循环的时候是i<2啊,i=3不就不执行了,就停了,怎么还会报错
    2020-03-31 13:41:45
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师