用for循环给几个元素绑定mouseove和mouseout事件,报错

发布于 2022-09-03 00:41:58 字数 2098 浏览 35 评论 0

chrome浏览器报这样的错误:“Uncaught TypeError: Cannot read property 'style' of undefined”
如果在for循环外绑定就不会出错。
js代码:

window.onload = function(){
    var sideList = document.getElementById("side_tool").getElementsByTagName("li");
    var contentList = document.getElementById("side_content").getElementsByTagName("div");
    for (var i = 0; i < sideList.length; i++){
        sideList[i].onmouseover = function(){
        contentList[i].style.display = "block";
    }
        sideList[i].onmouseout = function(){
        contentList[i].style.display = "none";
    }
    }
}

html代码:

<body>
        <div id="side_box">
            <div id="side_tool">
                <ul>
                    <li class="side_list" index="1"></li>
                    <li class="side_list" index="2"></li>
                    <li class="side_list" index="3"></li>
                    <li class="side_list" index="4"></li>
                    <li class="side_list" index="5"></li>
                    <li class="side_list" index="6"></li>
                </ul>
            </div>
            <div id="side_content">
                <div class="main_content" index="1" style="background-color: red; display: none;"></div>
                <div class="main_content" index="2" style="background-color: yellow; display: none;"></div>
                <div class="main_content" index="3" style="background-color: black; display: none;"></div>
                <div class="main_content" index="4" style="background-color: #888; display: none;"></div>
                <div class="main_content" index="5" style="background-color: #850; display: none;"></div>
                <div class="main_content" index="6" style="background-color: #058; display: none;"></div>
            </div>
        </div>
        <script src="js/main.js"></script>
    </body>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

梦太阳 2022-09-10 00:41:58

又遇到这个 for 循环和异步调用的问题了,请参考我在这个问题下的回答:https://segmentfault.com/q/1010000005797985/a-1020000005798132

离线来电— 2022-09-10 00:41:58

下标变了,找不到所以报错,
sideList[i].index=i;绑定下标
sideList[this.index];
contentList[this.index];对应的下标

我的鱼塘能养鲲 2022-09-10 00:41:58

这里的绑定事件是异步执行的,因此当真正执行到

 contentList[i].style.display = "block";

的时候,已经超出了for的作用域,因此i的值根本就不能按照你的设想等同于当前循环的i
正确做法应该是

for (var i = 0; i < sideList.length; i++){
        sideList[i].onmouseover = function(){
        contentList[this.index].style.display = "block";
    }
枯叶蝶 2022-09-10 00:41:58

用 let 替换 var

始终不够 2022-09-10 00:41:58

用自执行函数与闭包进行解决

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文