Uncaught TypeError - Неожиданное поведение - PullRequest
0 голосов
/ 16 мая 2011
var chanceOfLiveCells = 0.5;
var gridDomReference = null;
var gridDimension = 15;
var timer = null;

function init() {

    gridDomReference = document.getElementById('grid');
    idleCells = new Array();
    liveCells = new Array();
    deadCells = new Array();

    drawGrid();
    createRandomLiveCells();

}

function drawGrid() {

    var counter = 0;
    var nodes = new Array();

    for(var x = 0; x <= gridDimension - 1; x = x + 1) {

        nodes.push('<tr>');

        for(var y = 0; y <= gridDimension - 1; y = y + 1) {

            nodes.push('<td id="' + counter + '">' + counter + '</td>');
            idleCells.push(counter);
            counter = counter + 1;

        }

        nodes.push('</tr>');

    }

    gridDomReference.innerHTML = nodes.join('');

}

function createRandomLiveCells() {

    for(var x = 0; x <= gridDimension - 1; x = x + 1) {

        for(var y = 0; y <= gridDimension - 1; y = y + 1) {

            if(Math.random() < chanceOfLiveCells) {

                liveCells.push(x * gridDimension + y);
                idleCells.splice(getCell('idle', x, y), 1);
                document.getElementById(getCell('live', x, y)).innerHTML = 'L';
                console.log('[Live function] Live cells: ' + liveCells.length + ' | ' + ' Dead cells: ' + deadCells.length
                        + ' | Idle cells: ' + idleCells.length + ' | ' + 'getCell: ' + getCell('live', x, y) 
                        + ' | N: ' + (x * gridDimension + y));

            }

            else {

                deadCells.push(x * gridDimension + y);
                idleCells.splice(getCell('idle', x, y), 1);
                document.getElementById(getCell('dead', x, y)).innerHTML = 'D';
                console.log('[Dead function] Dead cells: ' + deadCells.length + ' | ' + ' Live cells: ' + liveCells.length
                        + ' | Idle cells: ' + idleCells.length + ' | ' + 'getCell: ' + getCell('dead', x, y) 
                        + ' | N: ' + (x * gridDimension + y));

            }

        }

    }

}

function getCell(array, x, y) {

    if(x > gridDimension - 1) {

        x = 0;

    }

    if(y > gridDimension - 1) {

        y = 0;

    }

    if(x < 0) {

        x = gridDimension - 1;

    }

    if(y < 0) {

        y = gridDimension - 1;

    }

    switch(array) {

        case 'idle': 

            return idleCells[x * gridDimension + y]; 

        break;

        case 'live': 

            return liveCells[x * gridDimension + y]; 

        break;

        case 'dead': 

            return deadCells[x * gridDimension + y]; 

        break;

    }

}

Я переписываю свою реализацию «Игры жизни Конвея», перед этим переписыванием я столкнулся с несколькими проблемами.Я предполагаю, что мой код правильный, но я озадачен этой проблемой.Я провел какое-то исследование, и многие говорят, что это связано с тем, как Chrome «делает вещи».

Вот общий вывод в консоли из выполнения:

gameoflife.js: 54 [Живая функция] Живые клетки: 1 |Мертвые клетки: 0 |Свободные ячейки: 225 |getCell: 0 |N: 0 gameoflife.js: 54 [Живая функция] Живых клеток: 2 |Мертвые клетки: 0 |Свободные ячейки: 224 |getCell: 1 |N: 1 gameoflife.js: 54 [Живая функция] Живых клеток: 3 |Мертвые клетки: 0 |Свободные ячейки: 221 |getCell: 2 |N: 2 gameoflife.js: 54 [Живая функция] Живых клеток: 4 |Мертвые клетки: 0 |Свободные ячейки: 214 |getCell: 3 |N: 3 gameoflife.js: 54 [Живая функция] Живых клеток: 5 |Мертвые клетки: 0 |Свободные ячейки: 206 |getCell: 4 |N: 4 gameoflife.js: 54 [Живая функция] Живых клеток: 6 |Мертвые клетки: 0 |Холостые ячейки: 197 |getCell: 5 |N: 5 gameoflife.js: 54 [Живая функция] Живых клеток: 7 |Мертвые клетки: 0 |Свободные ячейки: 187 |getCell: 6 |N: 6 gameoflife.js: 54 [Живая функция] Живых клеток: 8 |Мертвые клетки: 0 |Свободные ячейки: 169 |getCell: 7 |N: 7 gameoflife.js: 54 [Живая функция] Живых клеток: 9 |Мертвые клетки: 0 |Свободные ячейки: 142 |getCell: 8 |N: 8 gameoflife.js: 54 [Живая функция] Живых клеток: 10 |Мертвые клетки: 0 |Свободные ячейки: 105 |getCell: 9 |N: 9 gameoflife.js: 64 Uncaught TypeError: Невозможно установить для свойства 'innerHTML' значение null

Итак, здесь произошло 10 живых клеток, после которых была предпринята попытка создать мертвую ячейку., но вместо этого он возвращает ошибку.Когда я изменил запись в журнал перед кодом, строка перед ошибкой была такой:

gameoflife: 62 [Мертвая функция] Мертвые клетки: 0 |Живые клетки: 5 |Свободные ячейки: 206 |getCell: undefined |N: 5 gameoflife.js: 47 Uncaught TypeError: Невозможно установить свойство 'innerHTML' для null

Учитывая, что нет никаких отличий от создания живых ячеек, я не уверен, почему это происходит.Но вот еще одна вещь, которая сбивает с толку, с более низким шансом живых клеток, функция, которая создает мертвые клетки, на самом деле работает, и проблема заключается в функции, которая создает живые клетки.Мало того, есть странный паттерн в количестве ячеек в массиве idleCells, учитывая, что я использую функцию splice () только один раз на каждой итерации, чтобы удалить индекс, который находится либо в массиве liveCells, либо в массиве deadCells.

Сначала создается сетка, а затем idleCells заполняется идентификаторами ячеек таблицы.Когда я вызываю метод createRandomLiveCells (), задача этой функции - создавать случайные ячейки, либо мертвые, либо живые.Итак, я ожидаю, что и массив liveCells, и массив deadCells будут составлять количество ячеек таблицы, а массив idleCells пуст, поскольку нет свободных ячеек, поскольку ячейки таблицы либо мертвы, либо живы.

Извините за недокументированный код, я позаботился о том, чтобы он был хорошо выделен и выделен для удобства чтения, но, надеюсь, вы понимаете, что я пытаюсь сделать.помощь.

1 Ответ

0 голосов
/ 16 мая 2011

Прежде всего document.getElementById(str) ожидает строку, а не число, как в вашем случае.

И второе, значение атрибута ID в html должно соответствовать изложенным здесь правилам: http://www.w3.org/TR/html40/struct/global.html#h-7.5.2

В частности:

Жетоны ID и NAME должны начинаться с буква ([A-Za-z]) и может сопровождаться по любому количеству букв, цифр ([0-9]), дефисы ("-"), подчеркивание ("_"), двоеточия (":") и точки ( "").

Обратите внимание, что ID должен начинаться с буквы. Но вы используете простые числа.

...