javascript - 未定义的'appendChild'

标签 javascript html three.js

所以我正在尝试按照教程使用 THREE.js 实现太阳能系统,但是我收到以下错误:

Cannot read property 'appendChild' of undefined



这是我当前的代码:
<html>
    <head>
        <meta charset ="utf8">
        <title> Solar System Project </title>
        <script src = "three.min.js"></script>
    </head>

    <body>


        <script>

            // Standard Variables / To be changed later.
            var scene, camera, render, container;
            var W,H;

            // On load function...
            window.onload = function() {
                container = document.createElement('div');
                document.body.appendChild(container);

                W = parseInt(window.innerWidth);
                H = parseInt(window.innerHeight);

            }

            camera = new THREE.PerspectiveCamera(45, W/H, 1, 10000);
            camera.position.z = 4300;
            scene = new THREE.Scene();

            //Sun
            var sun, gun_geom, sun_mat;

            sun_geom = new THREE.SphereGeometry(430, 30,30);
            sun_mat = new THREE.MeshNormalMaterial();
            sun = new THREE.Mesh(sun_geom,sun_mat);
            scene.add(sun);


            // Earth
            var earth, earth_geom, earth_mat;

            earth_geom = new THREE.SphereGeometry(50, 20,20);
            earth_mat = new THREE.MeshNormalMaterial();
            earth = new THREE.Mesh(earth_geom,earth_mat);
            earth.position.x = 2000;
            scene.add(earth);

            render = new THREE.WebGLRenderer();
            render.setSize(W,H);
            container.appendChild(render.domElement);

            var t = 0;

            animate();


            function animate(){
                requestAnimationFrame(animate);

                sun.rotation.y+=0.001;
                earth.position.x = Math.sin(t*0.1) * 2000;
                earth.position.z = Math.cos(t*0.1) * 1700;

                t+= Math.PI/180*2;

                reneder.render(scene, camera);
            }

        </script>



    </body>
</html>

错误发生在第 49 行。

我已经尝试将它移到我的加载功能中,但这只会产生更多错误。

谢谢你。

最佳答案

你有两个小问题:

  • 为简单起见,一切都应该在 onload 范围内。你试图 appendChildonload 之前的容器功能已运行。
  • 你拼错了render在您的 animate功能

  • 这个例子有两个修复:

    <html>
      <head>
        <meta charset ="utf8">
        <title> Solar System Project </title>
        <script src = "https://cdnjs.cloudflare.com/ajax/libs/three.js/109/three.min.js"></script>
      </head>
      
      <body>
        
        
        <script>
          
          // Standard Variables / To be changed later.
          var scene, camera, render, container;
          var W,H;
          
          // On load function...
          window.onload = function() {
            container = document.createElement('div');
            document.body.appendChild(container);
            
            W = parseInt(window.innerWidth);
            H = parseInt(window.innerHeight);
            
            
            
            camera = new THREE.PerspectiveCamera(45, W/H, 1, 10000);
            camera.position.z = 4300;
            scene = new THREE.Scene();
            
            //Sun
            var sun, gun_geom, sun_mat;
            sun_geom = new THREE.SphereGeometry(430, 30,30);
            sun_mat = new THREE.MeshNormalMaterial();
            sun = new THREE.Mesh(sun_geom,sun_mat);
            scene.add(sun);
            
            
            // Earth
            var earth, earth_geom, earth_mat;
            earth_geom = new THREE.SphereGeometry(50, 20,20);
            earth_mat = new THREE.MeshNormalMaterial();
            earth = new THREE.Mesh(earth_geom,earth_mat);
            earth.position.x = 2000;
            scene.add(earth);
            
            render = new THREE.WebGLRenderer();
            render.setSize(W,H);
            container.appendChild(render.domElement);
            var t = 0;
            animate();
            
            function animate(){
              requestAnimationFrame(animate);
              
              sun.rotation.y+=0.001;
              earth.position.x = Math.sin(t*0.1) * 2000;
              earth.position.z = Math.cos(t*0.1) * 1700;
              
              t+= Math.PI/180*2;
              
              // `render` now spelled correctly
              render.render(scene, camera);
            }
            
            // everything now within `onload`
          }
            
            
        </script>
        
        
        
      </body>
    </html>

    关于javascript - 未定义的'appendChild',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59001799/

    相关文章:

    javascript - Google Analytics AJAX 电子商务跟踪

    html - 使用地理位置获取用户的状态

    javascript - 在 HTML 与 Javascript 中创建元素

    javascript - Three.js:无法更改 dat.GUI 中的值

    三.js 子级忽略父对象的缩放

    javascript - jquery 滚动到 anchor 单击页面上的位置

    javascript - 将最后一个 td 带到 tr knockout 中的下一行

    html - Chrome 中的 CSS 动画棘手错误

    camera - 三个JS。如何实现 ZoomALL 并确保给定的框填充 Canvas 区域?

    javascript - 如何从 Redis 获取所有数据到 Javascript 数组