欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决定时器报错:Uncaught TypeError: that.setAttribute is not a function

程序员文章站 2022-03-13 19:25:35
...

报错原因:
定时器里面的this指向的window,而window则没有下面用到的函数
解决办法:
在定时器外把需要用的this提前赋值给一个变量
定时器内使用该变量代替this


解决定时器报错:Uncaught TypeError: that.setAttribute is not a function

 解决定时器报错:Uncaught TypeError: that.setAttribute is not a function

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<svg id="s3" width="800" height="600" style="background-color: yellow">

</svg>
<script>
    function rn(max,min) {
        var num=Math.random()*(max-min)+min;
        return Math.floor(num)
    }
    function cn(max,min) {
        var r=rn(max,min)
        var g=rn(max,min)
        var b=rn(max,min)
        return `rgb(${r},${g},${b})`
    }
    console.log(rn(0,256))
    //创建一个循环30次
    var s3=document.getElementById("s3")

    for(var i=0;i<30;i++) {
        //创建圆
        var c = document.createElementNS(
            "http://www.w3.org/2000/svg",
            "circle"
        );
        c.setAttribute("r", rn(10, 80))
        c.setAttribute("cx", rn(0, 800))
        c.setAttribute("cy", rn(0, 600))
        c.setAttribute("fill", cn(0, 256))
        c.setAttribute("fill-opacity", rn(0, 10) * (0.1))
        s3.appendChild(c)
        c.onclick=function () {
            //此处this指向的c
            var that=this
            //为了防止圆被再次点击,消息监听函数
            that.onclick=null
            console.log(this)
            var x=this.getAttribute("r")
            var y=this.getAttribute("fill-opacity")
           var t= setInterval(function(){
                //定时器里的this为window
             x++
             y*=0.9
            that.setAttribute("r",x)
            that.setAttribute("fill-opacity",y)
            if(y<0.001){
                 clearInterval(t)
                s3.removeChild(that)
            }
        },100)

        }
    }
</script>
</body>
</html>

 

相关标签: 定时器 报错