首页 > 关于JS延时运行某句代码的问题,求大神帮助;

关于JS延时运行某句代码的问题,求大神帮助;

  1. 描述你的问题
    如下:

  2. 贴上相关代码
    我的代码中下面这两句,总是有错,我刚开始学又不知道哪里写错了,求大神帮看看我哪里写错了。谢谢哈;

setTimeout("this.parentNode.style.backgroundColor = '#998866';" , 3000 ); //求大神帮看一下我这句代码哪里写错了,老是错误提示Uncaught TypeError: Cannot read property 'style' of undefined这个;谢谢哈

odiv2_a.setTimeout("offsetParent.className = 'sef3';" ,3000); //还有这句话。谢谢哈。
  1. 以下是我的整个代码

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            .sef{
                width: 300px;
                height: 300px;
                background-color: #992233;
                position: absolute;
                top: 50px;
                left: 50px;
            }
            .sef2{
                width: 200px;
                height: 200px;
                background-color: #001133;
                position: relative;
                top: 0px;
                left:0px;
                color: #fff;
            }
            .sef3{
                width: 500px;
                height: 500px;
                background-color: #603301;
                position: relative;
                top: 100px;
                left:110px;
                color: #fff;
            }
            a:link{
                color: #fff;
            }
        </style>
        <script>
            window.onload = function(){
                var odiv1_a = document.getElementById('odiv1');
                var odiv2_a = odiv1_a.getElementsByTagName('div')[0];
                var Al_1 = odiv2_a.getElementsByTagName('a');
                for(var i=0; i<odiv2_a.childNodes.length;i++){
                    //li背景变色 
                    if(odiv2_a.childNodes[i].nodeType == 1){
                        //alert(odiv2_a.childNodes[i].innerHTML.length);
                        if(odiv2_a.childNodes[i].innerHTML.length % 2 == 0){
                            odiv2_a.childNodes[i].style.backgroundColor = '#003322';
                        }
                        else{
                            odiv2_a.childNodes[i].style.backgroundColor = '#339922';
                        }
                    }
                };
                
                //通过点击A标签里的隐藏链接隐藏父元素LI
                for(var i=0; i<Al_1.length;i++){
                    
                    //alert(Al_1[i].innerHTML);
                    Al_1[i].onclick = function(){
                        this.parentNode.style.backgroundColor = '#998866';
                        //this.parentNode.style.display = 'none';
                    setTimeout("this.parentNode.style.backgroundColor = '#998866';" , 3000 ); //求大神帮看一下我这句代码哪里写错了,老是错误提示Uncaught TypeError: Cannot read property 'style' of undefined这个;谢谢哈
                        
                }
                
            }
                //子元素通过定位查找父元素;
                alert(odiv2_a.offsetParent);
                odiv2_a.setTimeout("offsetParent.className = 'sef3';" ,3000); //还有这句话。谢谢哈。
                
            }
        </script>
    </head>
    <body>
        <div class="sef" id="odiv1">
            <div class="sef2">
                <li>ss<a href="javascript:;">隐藏</a></li>
                <li>saa<a href="javascript:;">隐藏</a></li>
                <li>a<a href="javascript:;">隐藏</a></li>
                <li>sasasa<a href="javascript:;">隐藏</a></li>
                <li>ss<a href="javascript:;">隐藏</a></li>
                <li>saa<a href="javascript:;">隐藏</a></li>
                <li>a<a href="javascript:;">隐藏</a></li>
                <li>sasasa<a href="javascript:;">隐藏</a></li>
            </div>
        </div>
    </body>
</html>

setTimeout("this.parentNode.style.backgroundColor = '#998866';" , 3000 );

setTimeout运行的作用域是全局的(window),所以上面的代码中this就为window。所以实际运行为:

window.parentNode.style.backgroundColor = '#998866';

所以就错误了。


建议你先去看一下js的setTimeout的用法,setTimeout是window级别的,直接div去调用不合适吧,还有set Timeout里面应该是function吧,直接传字符串不合适吧


可以尝试使用闭包

Al_1[i].onclick = function(){
    this.parentNode.style.backgroundColor = '#998866';
    var self = this;
    setTimeout(function() {
        self.parentNode.style.backgroundColor = '#998866';
    }, 3000)
}

setTimeout("this.parentNode.style.backgroundColor = '#998866';" , 3000 );

将字符串传递给setTimeout函数的第1个参数,那么JS将试图执行传入的代码字符串,
效果同下,函数体中的this指向全局对象,parentNode这个属性是没有的。就会出错

setTimeout(function(){
    this.parentNode.style.backgroundColor = '#998866';
} , 3000 );
odiv2_a.setTimeout("offsetParent.className = 'sef3';" ,3000); //还有这句话。谢谢哈。

setTimeout是全局函数,window对象才有这个属性,DOM元素是没有个这个方法的

【热门文章】
【热门文章】