Проблемы с холстом Javascript/HTML в Chrome/Firefox (не в Safari)

Когда я запускаю этот скрипт в Safari, все работает нормально. Однако, когда я открываю его в Chrome или Firefox, он не выполняется правильно. В консоли Chrome написано, что есть ошибки типа Uncaught для:

ctx.drawImage(img, x + 1, y + 1, iwh, iwh);

и

function renderStarField() {
    ctx.fillStyle = '#000000';
    ctx.fillRect(0, 0, WIDTH, HEIGHT);

    for (var i = 0; i < stars.length; i++) {
        stars[i].plot();
    }
}

Вот весь мой скрипт, спасибо за помощь!

<script type="text/javascript">
var starField = (function () {

    var browserWIDTH = $(document).width(),
        browserHEIGHT = $(document).height(),
        WIDTH = browserWIDTH + 500,
        HEIGHT = 400,
        FIELD_DEPTH = 15,
        DISTANCE = 500,
        STAR_DIAMETER = 45,
        STAR_SPEED = 0.003,
        canvas,
        ctx,
        numStars = 2000,
        stars = [];

    function Star() {
        this.calcPosition();
        var RANDSTAR = Math.floor(Math.random() * 3) + 1;
    }

    Star.prototype.calcPosition = function (reset) {
        this.x = this.randomise(-25, 50);
        this.y = this.randomise(-25, 50);
        this.z = reset ? FIELD_DEPTH : this.randomise(1, FIELD_DEPTH);
    };

    Star.prototype.randomise = function (min, max) {
        return Math.floor((Math.random() * max) + min);
    };

    Star.prototype.plot = function () {        
        //calculate 3d to 2d using perspective projection with the screen as the origin
        var x = this.x * (DISTANCE / this.z) + WIDTH / 2,
            y = this.y * (DISTANCE / this.z) + HEIGHT / 2;

        if ((x >= 0 && x <= WIDTH) && (y >= 0 && y <= HEIGHT)) {
                ctx.beginPath();
                var img = document.createElement('image');
                img.src ='Star1.png';
                var iwh = this.calcSize(this.z);
                ctx.moveTo(x, y);
                ctx.drawImage(img, x + 1, y + 1, iwh, iwh);
        }

        this.z -= STAR_SPEED;

        if (this.z <= 0) {
            this.calcPosition(true);
        }
    };

    Star.prototype.calcColor = function (z) {
        var rgb = Math.abs((z * 5) - 255).toFixed(0),
            a = (1 - ((z / (FIELD_DEPTH / 100)) / 100)).toFixed(1);

        return 'rgba(' + rgb + ', ' + rgb + ', ' + rgb + ', ' + a + ')';
    };

    Star.prototype.calcSize = function (z) {
        return Math.abs(((z / (FIELD_DEPTH / 100)) * (STAR_DIAMETER / 100)) - STAR_DIAMETER);
    };

    function setUpCanvas() {
        canvas = document.querySelector('#stage');
        canvas.width = WIDTH;
        canvas.height = HEIGHT;
        ctx = canvas.getContext('2d');
    }

    function buildStars() {
        for (var i = 0; i < numStars; i++) {
            stars.push(new Star());
        }
    }

    function renderStarField() {
        ctx.fillStyle = '#000000';
        ctx.fillRect(0, 0, WIDTH, HEIGHT);

        for (var i = 0; i < stars.length; i++) {
            stars[i].plot();
        }
    }

    function initialise() {
        setUpCanvas();
        buildStars();
        setInterval(renderStarField, 20);
    }

    return {
        init: initialise
    }
})();

document.addEventListener('DOMContentLoaded', function () {
    starField.init();
});
</script>

person Matt Carmody    schedule 04.02.2014    source источник


Ответы (1)


 if ((x >= 0 && x <= WIDTH) && (y >= 0 && y <= HEIGHT)) {
       ctx.beginPath();
       var img = document.createElement('image');
       img.src ='Star1.png';
       var iwh = this.calcSize(this.z);
       ctx.moveTo(x, y);
       ctx.drawImage(img, x + 1, y + 1, iwh, iwh);
 }

В этом коде есть ошибка

img.src = 'Star1.png' не работает, попробуйте img.setAttribute('src','Star1.png');

и Создать код тега <img> не document.createElement('image')

попробуй document.createElement('img');

Изменить на

 if ((x >= 0 && x <= WIDTH) && (y >= 0 && y <= HEIGHT)) {
       ctx.beginPath();
       var img = document.createElement('img');
       img.setAttribute('src','Star1.png');
       var iwh = this.calcSize(this.z);
       ctx.moveTo(x, y);
       ctx.drawImage(img, x + 1, y + 1, iwh, iwh);
 }
person LostCode    schedule 04.02.2014
comment
Если вы получите мне полный код через jsfiddle, я исправлю для вас ошибку. - person LostCode; 04.02.2014
comment
Это исправило эту ошибку, однако я все еще получаю ошибку типа с ctx.drawImage(img, x + 1, y + 1, iwh, iwh); - person Matt Carmody; 04.02.2014
comment
@MattCarmody Попробуйте этот код - person LostCode; 04.02.2014