javascript - 无法向 DOM 添加元素

标签 javascript html dom canvas appendchild

我正在制作一个将 Canvas 元素附加到 DIV 的小游戏框架,但每当我向 DIV 添加一个元素时,最后一个元素就会被删除。

这是我的 html:

<!DOCTYPE html>
<html>

    <head>

        <!-- Meta -->

        <meta charset=utf-8 />
        <title>Gimmick | Just another JS Game Framework</title>

        <!-- Styles -->

        <link rel="stylesheet" type="text/css" href="css/layout.css" />

        <!-- Scripts -->

            <!-- Framework -->

            <script type="text/javascript" src="js/gimmick/preloader.js"></script>
            <script type="text/javascript" src="js/gimmick/graphicsentity.js"></script>
            <script type="text/javascript" src="js/gimmick/entitycontainer.js"></script>
            <script type="text/javascript" src="js/gimmick/staticsprite.js"></script>

            <!-- Game -->



            <!-- Main thread -->

            <script type="text/javascript" src="js/main.js"></script> <!-- Main Thread -->

    </head>

    <body>

        <div id="game">

            <!-- Game Content is auto-generated by code -->

        </div><!-- Game -->

    </body>

主要代码:

document.addEventListener("DOMContentLoaded", function() {

    // Create new Stage
    //var mainStage = new EntityContainer("game");

    // Create some dummy DisplayObjects
    var blocks = [];
    var game = document.getElementById("game");


    for(var i = 0; i < 5; i++) {

        var block = new StaticSprite({ x: 0, y: 32 * i });
        game.appendChild(block.DOMElement)

    }

    /*window.setInterval(function() {

        for(var block in blocks) {
            blocks[block].x+= 1;
            blocks[block].y+= 1;
        }

    }, 12); */


}, false);

和类:

/**
  * Class for drawing static sprites, like trees and blocks
  */

function StaticSprite(args) {

    // Private Fields
    var texture = new Image();
    var graphics = this.graphics;

    // Events
    function textureLoaded() {

        // Draw image
        graphics.drawImage(texture, 0, 0, texture.width, texture.height);

        // Destroy unused vars
        delete graphics;

    }

    // Constructor

    // Add event listeners
    texture.addEventListener("load", textureLoaded, false);

    // Load texture
    texture.src = "img/assets/wall1.png";

    if(args != undefined) {

        // Set local fields
        this.x = args.x || this.x;
        this.y = args.y || this.y;
        this.z = args.z || this.z;
        this.width = args.width || this.width;
        this.height = args.height || this.height;

    }

    this.width = 32;
    this.height = 32;

}

// Inherit from GraphicsEntity
StaticSprite.prototype = new GraphicsEntity();

其他类:

/**
  * Class for presentation of graphical objects.
  */

function GraphicsEntity(args) {

    // Private Fields
    var x = 0; // The X-position of the GraphicsEntity relative to it's parent container
    var y = 0; // The Y-position of the GraphicsEntity relative to it's parent container
    var z = 0; // The Z-position of the GraphicsEntity relative to it's parent container
    var width = 0; // The width of the GraphicsEntity
    var height = 0; // The height of the GraphicsEntity

    // Public Fields
    this.DOMElement = null; // Reference to the corresponding HTML Element
    this.graphics = null; // The 2D context for rendering 2D onto the element.
    this.name = ""; // The name of the GraphicsEntity

    // Properties
    // The Alpha or transparency value of the GraphicsEntity, 1 is completely opaque, 0 is completely transparent.
    Object.defineProperty(this, "alpha", {

        get: function() { return parseFloat(this.DOMElement.style.opacity); },
        set: function(value) { this.DOMElement.style.opacity = value; }

    });

    // The height of the GraphicsEntity
    Object.defineProperty(this, "height", {

        get: function() { return height; },
        set: function(value) {

            height = value; // Set internal width
            this.DOMElement.setAttribute("height", height); // Set DOMElement width

        }

    });

    // The width of the GraphicsEntity
    Object.defineProperty(this, "width", {

        get: function() { return width; },
        set: function(value) {

            width = value; // Set internal width
            this.DOMElement.setAttribute("width", width); // Set DOMElement width

        }

    });

     // The X-position of the GraphicsEntity relative to it's parent container
    Object.defineProperty(this, "x", {

        get: function() { return x; },
        set: function(value) {

            x = value; // Set internal X-axis
            this.DOMElement.style.left = Math.ceil(x) + "px"; // Set DOMElement X-axis

        }

    });

    // The Y-position of the GraphicsEntity relative to it's parent container
    Object.defineProperty(this, "y", {

        get: function() { return y; },
        set: function(value) {

            y = value; // Set internal Y-axis
            this.DOMElement.style.top = Math.ceil(y) + "px"; // Set DOMElement Y-axis

        }

    });

    // The Z-position of the GraphicsEntity relative to it's parent container
    Object.defineProperty(this, "z", {

        get: function() { return z; },
        set: function(value) { this.DOMElement.style.zIndex = parseInt(value); }

    });

    // Constructor

    // Get constructor values of use default
    if(args) {

        x = args.x || x;
        y = args.y || y;
        z = args.z || z;
        width = args.width || width;
        height = args.height || height;

    }

    // Create a new canvas element
    this.DOMElement = document.createElement('canvas');

    // Set postion
    this.DOMElement.style.position = "absolute"; // Positioning style
    this.DOMElement.style.left = x + "px"; // X-axis
    this.DOMElement.style.top = y + "px";  // Y-axis
    this.DOMElement.style.zIndex = z; // Z-Axis
    this.DOMElement.width = width;
    this.DOMElement.height = height;

    // Set opacity/alpha
    this.DOMElement.style.opacity = 1;

    // Get 2d canvas context
    this.graphics = this.DOMElement.getContext('2d');

}

最佳答案

首先看看这个:

StaticSprite.prototype = new GraphicsEntity();

稍后在 GraphicsEntity() 中:

this.DOMElement = document.createElement('canvas');

block.DOMElement 将始终是相同的元素,即在 GraphicsEntity() 中创建并分配给 StaticSprite 原型(prototype)的 Canvas 元素。

关于javascript - 无法向 DOM 添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287304/

相关文章:

javascript - 连接两个页面内的数据

javascript - 如何判断 CSS 属性是否由页面作者手动设置?

javascript - 使用 jQuery 的 data() 应该注意什么样的内存泄漏?

jquery - 应使用什么策略来最小化页面初始化抖动?

html - 这段 CSS 代码出了点问题

javascript - 如何在 chartjs 中扩展圆环图的切片?

html - CSS 麻烦,bootstrap - header 吞噬页面

javascript - Rails 模型名称更改后未定义 TypeError : this. clusterer

javascript - nuxt-img 和 js 文件无法在服务器上的生产模式下加载

javascript - 如何纠正 JavaScript 中的 for 循环?