Определенные строки в функции JavaScript не работают - PullRequest
0 голосов
/ 13 марта 2011

Я только что получил эту функцию, работающую этим вечером. Тем не менее, после нескольких незначительных изменений, которые заставили выполнить другую часть if / else, часть его волшебным образом перестала работать.

Все четыре цикла for в функции обратного вызова запроса json все выполняются, но на самом деле ни одна из манипуляций с DOM не выполняется. Я трижды проверил, что для этого существуют соответствующие элементы DOM. Оповещения будут срабатывать во всех из них. Просто строки jQuery терпят неудачу.

Я попытался поместить соответствующие переменные в консоль и вручную перебирать числа для имитации цикла. Это отлично работает. Я также использовал оповещения для отображения последовательности переменных в цикле, и все они работают правильно.

Я сбит с толку.

function drawPreview() {
    var $preview = $('#preview');
    $preview.remove();
    $('#general_preview').remove();
    try {
        activecell.location;
    }
    catch (error) {
        $('#active_cell').clone().attr('id','general_preview').appendTo('#win_preview');
        return;
    }
    if (activecell.location.match(/^\d+_\d+$/)!==null) {
        var x = parseInt(activecell.location.slice(0,activecell.location.indexOf("_")));
        var y = parseInt(activecell.location.slice(activecell.location.indexOf("_")+1));
        var area = "x"+activearea.join("x")+"x";
        $('#win_preview').append($('<div id="preview"><div><div></div><div></div><div></div></div><div><div></div><div></div><div></div></div><div><div></div><div></div><div></div></div></div>'));
        var i = y-1;
        var j = x-1;
        function loadCell() {
            var exp = new RegExp("x"+i+"_"+j+"x","g");
            if (area.match(exp)) {
                if (i==y&&j==x) {
                    $('#active_cell').clone().children().unwrap().appendTo($preview.children().eq(1).children().eq(1));
                    ++j;
                    loadCell();
                }
                else {
                    var jqxhr = $.getJSON('data/areas/'+$('#select_area').val()+'/'+x+"_"+y+'.json', function(data) {
                        var tmp = data;
                        for (var l=0; l<9; ++l) {
                            $preview.children().eq(i-y+1).children().eq(j-x+1).append('<div></div>');
                        }
                        for (var l=0; l<9; ++l) {
                            $preview.children().eq(i-y+1).children().eq(j-x+1).children().append('<div></div>');
                        }
                        for (var l = 0; l < 9; ++l) {
                            for (var m = 0; m < 9; ++m) {
                                $preview.children().eq(i-y+1).children().eq(j-x+1).children().eq(l).children().eq(m).attr("style","background: #"+tmp.p.c[tmp.c[l][m]-1]+" url(textures/terrain/"+tmp.p.t[tmp.t[l][m]-1]+".png) bottom center no-repeat");
                            }
                        }
                        if (i==y+1&&j==x+1) {
                            return;
                        }
                        else if (j==x+1) {
                            ++i;
                            j = x-1;
                            loadCell();
                        }
                        else {
                            ++j;
                            loadCell();
                        }
                    })
                        .error(function() { alert("There was an error loading the data. The data may be invalid or you may be looking for a file that does not exist."); })
                }
            }
            else {
                if (i==y+1&&j==x+1) {
                    return;
                }
                else if (j==x+1) {
                    ++i;
                    j = x-1;
                    loadCell();
                }
                else {
                    ++j;
                    loadCell();
                }
            }
        }
        loadCell();
    }
}

Ответы [ 2 ]

3 голосов
/ 13 марта 2011

вначале вы вызываете это

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)где именно вы пытаетесь добавить.Дополнительным преимуществом этого является то, что он направляет вас к оптимизации вашего кода - вы получаете цель добавления один раз, а затем просто добавляете ее в цикл.Предыдущий вариант будет выполнять как получение цели, так и добавление в цикле.

0 голосов
/ 13 марта 2011

Я сделал довольно стандартный рефакторинг, чтобы уменьшить количество вложенных операторов if (это обычная почва для логических ошибок и путаницы).Я бы посоветовал вам опубликовать немного тестовых данных (если хотите), данных, которые вы ожидали бы, чтобы это действительно заработало.Достаточно сегмента действительного dom и выборки данных ячейки.

function drawPreview() {
    var $preview = $('#preview'),
        x, y, area, i, j;

    function repeat( text, count ){
        var i=0, out = '';
        for( ; i++ < count ; ) {
            out += text;
        }
        return out;
    }

    $preview.remove();
    $('#general_preview').remove();
    try {
        activecell.location;
    }
    catch (error) {
        $('#active_cell').clone().attr('id','general_preview').appendTo('#win_preview');
        return;
    }
    if (activecell.location.match(/^\d+_\d+$/) === null ){
        return;
    }
    x = parseInt(activecell.location.slice(0,activecell.location.indexOf("_")), 10);
    y = parseInt(activecell.location.slice(activecell.location.indexOf("_")+1), 10);
    area = "x"+activearea.join("x")+"x";
    $('#win_preview').append($('<div id="preview"><div>' + repeat('<div>' + repeat('<div></div>', 4) + '</div>', 3) + '</div></div>'));
    i = y-1;
    j = x-1;
    function loadCell() {
        var exp = new RegExp("x"+i+"_"+j+"x","g"),
            sel_area;

        if (! area.match(exp)){
            if (i==y+1&&j==x+1) {
                return;
            }
            else if (j==x+1) {
                ++i;
                j = x-1;
                loadCell();
            }
            else {
                ++j;
                loadCell();
            }
            return;
        }
        if (i==y&&j==x) {
            $('#active_cell').clone()
                .children()
                .unwrap()
                .appendTo($preview.children()
                                .eq(1)
                                .children()
                                .eq(1)
                );
            ++j;
            loadCell();
            return;
        }
        var sel_area = $('#select_area').val();
        var jqxhr = $.getJSON('data/areas/'+ sel_area +'/'+x+"_"+y+'.json', function(data) {
            var tmp = data, l = 0, m = 0;
            for ( l=0; l<9; ++l ) {
                $preview.children()
                        .eq(i-y+1)
                        .children()
                        .eq(j-x+1)
                        .append('<div></div>');
            }
            for ( l=0; l<9; ++l) {
                $preview.children()
                        .eq(i-y+1)
                        .children()
                        .eq(j-x+1)
                        .children()
                        .append('<div></div>');
            }
            for ( l = 0; l < 9; ++l) {
                for ( m = 0; m < 9; ++m) {
                    $preview.children()
                            .eq(i-y+1)
                            .children()
                            .eq(j-x+1)
                            .children()
                            .eq(l)
                            .children()
                            .eq(m)
                            .css({background: "#"+tmp.p.c[tmp.c[l][m]-1]+" url(textures/terrain/"+tmp.p.t[tmp.t[l][m]-1]+".png) bottom center no-repeat"});
                }
            }
            if (i==y+1&&j==x+1) {
                return;
            }
            else if (j==x+1) {
                ++i;
                j = x-1;
                loadCell();
                return;
            }
            ++j;
            loadCell();
            return;
        }).error(function() { alert("There was an error loading the data. The data may be invalid or you may be looking for a file that does not exist."); });
    }
    loadCell();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...