Цикл рекурсии CreateJS Container для вложенных объектов

Я разработчик ActionScript, наконец-то окунувшийся в HTML5 и JavaScript. Я использую CreateJS, так как он имеет репутацию более легкого перехода для таких людей, как я. Я пытаюсь создать цикл рекурсии, чтобы сообщить мне, какие вложенные объекты у меня есть на моей сцене. Я, очевидно, еще не там. Может ли кто-нибудь помочь указать, где я ошибаюсь? Спасибо.

recur(exportRoot);

function recur(thisContainer)
{
    console.log("recur()");
    for(var i=0; i<thisContainer.getNumChildren; i++)
    {
        console.log(thisContainer.getChildAt[i]);
        if(thisContainer.getChildAt[i].getNumChildren !== null && thisContainer.getChildAt[i].getNumChildren !== isNaN())
        {
            recur(thisContainer.getChildAt[i]);
        }
    }
}

person Steve Bird    schedule 04.10.2013    source источник
comment
Если вы хотите проверить, является ли foo NaN, используйте isNaN(foo) вместо foo !== isNaN()   -  person Oriol    schedule 04.10.2013


Ответы (2)


Вместо того, чтобы использовать getNumChildren, чтобы увидеть, является ли дочерний элемент контейнером, вы должны использовать это:

var child = thisContainer.getChildAt[i];
if ( child instanceof createjs.Container ) {
    recur(child);
}

Обновление для wakeljs-0.8.1:

    private loopContaneir(objDisplay) {
        for (var i= 0; i < objDisplay.numChildren; i++) {
            var child = objDisplay.getChildAt(i);
            if (child instanceof createjs.Container) {
                loopContaneir(child);
            }
        }
    }
person olsn    schedule 04.10.2013
comment
Спасибо @olsn, но это все еще не работает. Вот что у меня сейчас: recur(stage); //I've also tried with recur(exportRoot) function recur(thisContainer) { console.log("recur()"); for(var i=0; i<thisContainer.getNumChildren; i++) { var thisChild = thisContainer.getChildAt[i] console.log(thisChild); if(thisChild instanceof createjs.Container) { recur(thisChild); } } } Извините за форматирование. Кажется, я не могу это исправить. Вот что я получаю в своей консоли: recur() - person Steve Bird; 04.10.2013

Кажется, одной из моих самых больших проблем было то, что я пытался использовать getNumChildren (несуществующее свойство), а не getNumChildren() (метод). Теперь у меня все работает правильно, отчасти спасибо @olsn за предложение instanceof.

recur(exportRoot);

function recur(thisContainer)
{
    console.log("recur()");
    var containerLength = thisContainer.getNumChildren();
    var thisChild;
    for(var i=0; i<containerLength; i++)
    {
        thisChild = thisContainer.getChildAt(i);
        console.log(thisChild);
        if(thisChild instanceof createjs.Container)
        {
            recur(thisChild);
        }
    }
}
person Steve Bird    schedule 04.10.2013
comment
Хотя это работает, вы можете подумать об использовании переменной для thisContainer.getChildAt(i) - если вы просто делаете это как тест, это не будет иметь значения, но если вы используете это как служебный метод, который часто вызывается в вашем приложении, используя локальная переменная немного быстрее, чем 3-кратный вызов метода getChildAt, который даже на другом объекте. И это также чище ;-) (возможно, вы заметите разницу на своем телефоне, на вашем компьютере уже не так много, так как движки Javascript сейчас становятся все быстрее и быстрее) - Но в любом случае, gz, теперь это работает :) - person olsn; 04.10.2013
comment
Спасибо. В ActionScript я всегда понимал, что типизированный оператор var также несет некоторые накладные расходы, и я старался избегать их использования в циклах, когда они будут вызываться десятки или сотни раз. Возможно, это было неправильно? Возможно, JavaScript отличается. В любом случае, спасибо. Я отредактирую ответ по вашему совету. - person Steve Bird; 05.10.2013
comment
Ах, конечно. Я только что добавил оператор var перед циклом. Извините, я все еще несколько дезориентирован из-за смены языков. В частности, отсутствие строгой типизации данных. Спасибо за помощь и терпение. - person Steve Bird; 05.10.2013