这个JavaScript我就是想不通,我明明有定义,为什么老报错没有定义!
大家讲道理
大家讲道理 2017-04-10 15:58:58
[JavaScript讨论组]

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        #p1,#p2,#p3 {
    width: 200px;
    height: 200px;
    background: red;
    margin: 10px;
}
    </style>
</head>

<body>
    <p id="p1"></p>
    <p id="p2"></p>
    <p id="p3"></p>
    <script type="text/javascript">
        var timer = null;
        op = document.getElementsByTagName("p");

        function test(i) {
            timer = setInterval(function() {
                op[i].style.height = op[i].offsetHeight + 2 + 'px'
            }, 30)
        };
        for (var i = 0; i < 3; i++) {
            op[i].onmouseover = function() {
                test(i);
            }
            op[i].onmouseout = function() {
                clearInterval(timer);
            }
        }
    </script>
</body>

</html>
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(6)
巴扎黑

@小_秦 已经指出问题了,也提供了解决方法。我再补充两种,其他朋友如果有其他方法的话不妨贴上来。

/*
        var timer = null;
        op = document.getElementsByTagName("p");

        for (var i = 0; i < 3; i++) {
            op[i].onmouseover = function() {
                var _this=this;
                timer = setInterval(function() {
                  _this.style.height = _this.offsetHeight + 2 + 'px'
            }, 30);
            //方法一:避免在闭包里面引用外包函数的变量,用this来代替
            }
            op[i].onmouseout = function() {
                clearInterval(timer);
            }
        }
    */

    //===================================================================

    /*
        var timer = null;
        op = document.getElementsByTagName("p");

        for (var i = 0; i < 3; i++) {
            op[i].onmouseover = function() {
                timer = setInterval(function() {
                  this.style.height = this.offsetHeight + 2 + 'px'
            }.bind(this), 30);
            //方法一改良
            }
            op[i].onmouseout = function() {
                clearInterval(timer);
            }
        }
    */

    //===================================================================

        var timer = null;
        op = document.getElementsByTagName("p");

        function test(i) {
            timer = setInterval(function() {
                op[i].style.height = op[i].offsetHeight + 2 + 'px'
            }, 30)
        };
        for (var i = 0; i < 3; i++) {
            op[i].onmouseover = function(num){
                return function() {
                    test(num);
                }
            }(i);
            //方法二:用iife来替换,事实上,就是用iife的形参作为桥梁在两个作用域之间传值
            op[i].onmouseout = function() {
                clearInterval(timer);
            }
        }
伊谢尔伦

1.楼主最好去学习一下MARKDOWN怎么写。
2.这个是闭包陷阱

ringa_lee

你可以使用闭包实验一下你这个for绑定事件肯定不对的,绑定的i都是3所以肯定op[3]都是不存在的,

伊谢尔伦

1)
p1,#p2,#p3{width:200px;height:200px;background:red;margin:10px;}
==》
#p1,#p2,#p3{width:200px;height:200px;background:red;margin:10px;}
2)p,mouseover事件触发函数中的i为3,这里涉及到js中变量作用域
3) p的事件绑定推荐使用代理的方式-不用为每一个p绑定事件回调

巴扎黑

timer = null; 后面应该是逗号

var timer=null,
op=document.getElementsByTagName("p");
伊谢尔伦

你声明变量时,要用var,如果是全局变量时函数内部不用var,儿最外层原始变量需要var的,这段代码,错误百出啊,以上楼层说了闭包的问题,就不多说了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号