вначале вы вызываете это
var $preview = $('#preview');
затем, в первой ветви if
:
$('#win_preview').append($('<div id="preview"><div...
, что нормально, но в обратном вызове, выполняя
$preview.children().eq(i-y+1).children()....
вы пытаетесь получить доступ к элементу, который больше не существует.Вам нужно получить новую ссылку на только что добавленную #preview
.Может быть, после этой строки с тоннами <div></div>
добавляется:)
РЕДАКТИРОВАТЬ:
Кроме того, я бы рекомендовал вам использовать немного селекторов классов, вместо того чтобы полагаться на точное дерево DOMструктура (с использованием лотов eq()
).Это может сэкономить вам время в будущем, если вы хотите как-то обновить разметку.Кроме того, как только вы войдете в стилизацию этого, вы можете получить эти селекторы как побочный эффект стиля CSS, так почему бы не использовать их сразу.
Другое дело: если код становится таким сложным и не слишком читаемым, вы можете попытаться помочь себе с небольшим количеством отладки:
for (var l=0; l<9; ++l) {
$preview.children().eq(i-y+1).children().eq(j-x+1).append('<div></div>');
}
можно также записать как
var targetParent = $preview.children().eq(i-y+1).children().eq(j-x+1);
console.log(targetParent);
for (var l=0; l<9; ++l) {
targetParent.append('<div></div>');
}
, который вы увидите в консоли (при условии отладки firefox + firebug)где именно вы пытаетесь добавить.Дополнительным преимуществом этого является то, что он направляет вас к оптимизации вашего кода - вы получаете цель добавления один раз, а затем просто добавляете ее в цикл.Предыдущий вариант будет выполнять как получение цели, так и добавление в цикле.