×
Traktatov.net » JavaScript. Учебник начального уровня » Читать онлайн
Страница 14 из 15 Настройки

В общем при большом желании можно ещё писать и писать. Однако, дело в том, что ничего принципиально нового мы при этом не пройдём, с теми знаниями, что мы уже прошли всё это и так можно сделать. Возможно стоит только сделать ряд опций, посмотрим.

Сегодня впервые я решил не приводить весь код программы, так как изменения коснулись только функции initTable. Вот во что она превратилась:


>var mines = new minesClass(10, 10, 10);

>        function checkCell(i, j)

>        {var tbl = document.getElementById(«tbl»);

>              var cell = tbl.rows[i].cells[j];

>              var s = mines.checkCell(i, j);

>              cell.innerHTML = s;

>              if (s == "*")

>                    cell.bgColor = 'red';}


>        function initTable()

>        {var tbl = document.getElementById(«tbl»);

>              for (var i = 0; i < mines.rowCount; i++)

>              {var row = tbl.insertRow(i);

>                    for(var j = 0; j < mines.colCount; j++)

>                    {var cell = row.insertCell(j);

>                          cell.innerHTML = '?';

>                          function SetCellClick(i, j)

>                          {cell.onclick= function() {checkCell(i, j)};};

>                          SetCellClick(i, j);}}}

Давайте по порядку. Строчку «var mines = new minesClass(10, 10, 10);" я перенёс наверх, чтобы переменная mines стала доступна из других функций (напомню, что переменная, объявленная внутри функции доступна только внутри этой функции, а «внешние» переменные доступны также в других функциях). Нам потребуется использовать эту переменную в функции checkCell, которую мы выделили из функции initTable.

По сути, в функции checkCell мы получаем из таблицы ячейку с i-ой строкой и j-ым столбцом и присваиваем ей текст, соответствующий количеству бомб рядом (раньше мы это делали непосредственно при инициализации таблицы). Для получения ссылки на ячейку, мы получаем ссылку на таблицу с помощью метода getElementById заранее предопределённой переменной document. Далее мы получаем ссылку на нужную строку, обращаясь к полю rows таблицы (это массив, поэтому после имени поля в квадратных скобках указываем индекс) и сразу же обращаемся к полю cells строки (это тоже массив) для получения искомой ссылки на ячейку.

Последующие строки функции checkCell мы перенесли из функции initTable без изменений.

Ну и последнее о чём осталось рассказать — функция initTable. Несколько строчек мы оттуда унесли и появилась, несколько добавили:


>                      cell.innerHTML = '?';

>                      function SetCellClick(i, j)

>                      {cell.onclick= function() {checkCell(i, j)};};

>                      SetCellClick(i, j);


С первой строкой, думаю, проблем не будет, а вот дальше придётся применить один интересный приём под названием замыкание. Этот метод нашёл широкое применение в JavaScript, не знаю используется–ли он в других языках, не сталкивался, а тут без него ряд задач сделать крайне сложно.

Так вот, зачем же мы пишем так:


>                      function SetCellClick(i, j)

>                      {cell.onclick= function() {checkCell(i, j)};};