@zanooda

Почему не корректно работает функция append?

Есть:
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Tetris</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link rel="stylesheet" href="css/bootstrap-theme.min.css">
    <script src="js/vendor/modernizr-2.8.3-respond-1.4.2.min.js"></script>
    <style> </style>

</head>
<body>
    <div class="container">
        <div id="grid"></div>
    </div>

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.11.2.min.js"><\/script>')</script>
    <!-- <script src="js/vendor/jquery-3.0.0.js"></script> -->
    <script src="js/vendor/bootstrap.min.js"></script>

    <!-- Tetris logic -->

    <script src="js/tetris.js"></script>

    <script>
        // Initial table
        $(document).ready(function () {
            var grid = $("#grid");
            grid.append("<table>");
            for (var height = 0; height < 16; height++) {
                grid.append('<tr>');
                for (var width = 0; width < 10; width++) {
                    grid.append('<td></td>');
                }
                grid.append('</tr>');
            }
            grid.append('</table>');
        });
    </script>

</body>
</html>


Я ожидаю получить таблицу 10 на 16 но получается вот что:
<div id="grid">
    <table></table>
    <tr></tr>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <td></td>
    <tr></tr>
    <td></td>
    ...
    <td></td>
    <td></td>
    ...
</div>


Почему вместо:
<table>
  <tr>
    <td></td>
    ...
  </tr>
  <tr>
    <td></td>
    ...
  </tr>
</table>


я получаю вначале

<table></table>
...


Почему не:
<table>
...
</table>


Я могу изменить скрипт:
$(document).ready(function () {
            var table = "<table>";
            for (var height = 0; height < 16; height++) {
                table +='<tr>';
                for (var width = 0; width < 10; width++) {
                    table += '<td></td>';
                }
                table += '</tr>';
            }
            table += '</table>';
            $("#grid").append(table);
        });

тогда всё работает но почему не работает вот так?
$(document).ready(function () { var grid = $("#grid");
            grid.append("<table>");
            for (var height = 0; height < 16; height++) {
                grid.append('<tr>');
                for (var width = 0; width < 10; width++) {
                    grid.append('<td></td>');
                }
                grid.append('</tr>');
            }
            grid.append('</table>');
        });
  • Вопрос задан
  • 423 просмотра
Решения вопроса 2
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
var grid = $("#grid");
var table = $('<table>'), tr, td;
grid.append(table);

for (var height = 0; height < 16; height++) {
      tr = $('<tr>');
      for (var width = 0; width < 10; width++) {
            tr.append('<td></td>');
      }
      table.append(tr);
}


но вариант со строками будет быстрее работать за счет единственного изменения DOM.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Потому что вы изменяете не исходный текст страницы, а уже сформированное DOM-дерево. При добавлении тэга <table> браузер встраивает его в дерево автоматически закрывая завершающим </table>. Соответственно, следующие добавления идут после узла table.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы