javascript - 关于JS定时器与for循环的问题,求大神帮助;
阿神
阿神 2017-04-10 17:04:34
[JavaScript讨论组]
  1. 描述你的问题
    如下我是我写的代码;我想要实现的效果是,点击按钮时,每1秒钟给p下面的UL里添加一个LI元素节点;当达到10个LI时停止添加,但是我写出来的代码总是提示 “Uncaught ReferenceError: sih is not defined”。。。但我看网上那些写的定时器是可以直接调取函数名的呀。求大神帮我看一下我哪里写错了,并帮我改正最好;谢谢哈;

  2. 贴上相关代码

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script>
        //获取ID styl的子节点UI,并通过document.createElement与appendChild的配合,在UL里增加10个LI元素。
            window.onload = function(){
                var op_1 = document.getElementById('styl');
                var oul_1 = op_1.getElementsByTagName('ul')[0];
                var oinput_1 =document.getElementById('inp');
                function sih(){
                    for(var i=0;i<10;i++){
                    var e = document.createElement("li");
                    e.innerHTML = "这是一个文字" + i % 2;
                    oul_1.appendChild(e);
                    if(i%2 == 1){
                        e.style.backgroundColor = "#990099";
                    }
                    else{
                        e.style.backgroundColor = "#012911";
                        e.style.color = "#ffffff";
                    }
                };
                };
                oinput_1.onclick = function(){
                    setInterval("sih()",1000);
                }
                
            }
            
        </script>
    </head>
    <body>
    <input type="button" value="添加LI" id="inp" />
        <p id="styl">
            <ul>
                
            </ul>
            
        </p>
    </body>
</html>
  1. 贴上报错信息

  2. 贴上相关截图

  3. 已经尝试过哪些方法仍然没解决(附上相关链接)

阿神
阿神

闭关修行中......

全部回复(10)
黄舟

把你的sih()函数定义放到window.onload里面,然后,在setInterval函数里,调用的时候,这样写setInterval(sih, 1000)

高洛峰

setInterval函数的第一个参数可以为一个函数对象或一个用字符串表示的js代码段;
但是使用字符串时,字符串表示的代码作用域处于最外层,也就是全局作用域下,那么sih变量就要在全局作用域下寻找,而在全局作用域下没有sih这个变量定义

修改方法,传入函数对象而非字符串

oinput_1.onclick = function(){
    setInterval(sih,1000);
}
伊谢尔伦

oinput_1.onclick 也放到 inload里去

ringa_lee

把你setInterval传入的函数名后面的括号去掉

ringa_lee

你的点击函数也要放在window.onload里面的

天蓬老师

你的 sih() 是放在 onload 的 function 里边的,但是在 setInterval 引用时却是在它(作用域)外边的,所以要把 onclick 处理整体挪到 onload 的 function 里边去才行。

巴扎黑

下面的可以:

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script>
        //获取ID styl的子节点UI,并通过document.createElement与appendChild的配合,在UL里增加10个LI元素。
            window.onload = function(){
                var op_1 = document.getElementById('styl');
                var oul_1 = op_1.getElementsByTagName('ul')[0];
                var oinput_1 =document.getElementById('inp');
                oinput_1.onclick = function(){
                    setInterval("sih()",1000);
                }
                };
                

                function sih(){
                    var op_1 = document.getElementById('styl');
                var oul_1 = op_1.getElementsByTagName('ul')[0];
                    for(var i=0;i<10;i++){
                    var e = document.createElement("li");
                    e.innerHTML = "这是一个文字" + i % 2;
                    oul_1.appendChild(e);
                    if(i%2 == 1){
                        e.style.backgroundColor = "#990099";
                    }
                    else{
                        e.style.backgroundColor = "#012911";
                        e.style.color = "#ffffff";
                    }
                };
                
            }
            
        </script>
    </head>
    <body>
    <input type="button" value="添加LI" id="inp" />
        <p id="styl">
            <ul>
                
            </ul>
            
        </p>
    </body>
</html>
PHP中文网
window.onload = function(){
                var op_1 = document.getElementById('styl');
                var oul_1 = op_1.getElementsByTagName('ul')[0];
                var oinput_1 =document.getElementById('inp');
                num = 0;
                function sih(){
                    if(num >= 10){
                        return false;
                    }
                    var e = document.createElement("li");
                    e.innerHTML = "这是一个文字" + num % 2;
                    oul_1.appendChild(e);
                    if(num%2 == 1){
                        e.style.backgroundColor = "#990099";
                    }else{
                        e.style.backgroundColor = "#012911";
                        e.style.color = "#ffffff";
                    }
                    num++;
                };
                oinput_1.onclick = function(){
                    setInterval(sih,1000);
                }
                
            }
大家讲道理

因为当调用setInterval时传递字符串函数,它会从全局作用域window里查找相关函数,但你的函数定义在onload方法,访问不到,因此不管用。
window.onload = function(){

            function sih(){
                for(var i=0;i<10;i++){
                    var e = document.createElement("li");
                    e.innerHTML = "这是一个文字" + i % 2;
                    oul_1.appendChild(e);
                    if(i%2 == 1){
                        e.style.backgroundColor = "#990099";
                    }
                    else{
                        e.style.backgroundColor = "#012911";
                        e.style.color = "#ffffff";
                    }
                };
            };

            var oinput_1 =document.getElementById('inp');
            var op_1 = document.getElementById('styl');
            var oul_1 = op_1.getElementsByTagName('ul')[0];
            oinput_1.onclick = function(){
                setInterval(function(){
                    sih();
                },1000);
            }
        }
        
大家讲道理

你的代码有两个地方要注意:

1,就是报错,找不到sin,这个按照@kikong说的思路解决即可

oinput_1.onclick = function(){
    setInterval(sih,1000);
}

2,在解决报错后,你的代码和你要实现的需求不一致,点击按钮后会1s钟生成十行li,应修改sin函数不用for 循环处理,可以参考以下代码

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script>
        //获取ID styl的子节点UI,并通过document.createElement与appendChild的配合,在UL里增加10个LI元素。
            window.onload = function(){
                var op_1 = document.getElementById('styl');
                var oul_1 = op_1.getElementsByTagName('ul')[0];
                var oinput_1 =document.getElementById('inp');
                var i = 1,
                    loop = null;
                function sih(){
                    //for(var i=0;i<10;i++){
                        var e = document.createElement("li");
                        e.innerHTML = "这是一个文字" + i;
                        oul_1.appendChild(e);
                        if(i%2 == 1){
                            e.style.backgroundColor = "#990099";
                        }
                        else{
                            e.style.backgroundColor = "#012911";
                            e.style.color = "#ffffff";
                        }
                        if(i < 10){
                            i++;
                        }else{
                            clearInterval(loop);
                        };
                    //};
                };
                oinput_1.onclick = function(){
                    loop = setInterval(sih,1000);
                }
                
            }
            
        </script>
    </head>
    <body>
    <input type="button" value="添加LI" id="inp" />
        <p id="styl">
            <ul>
                
            </ul>
            
        </p>
    </body>
</html>
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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