Проблема области видимости переменной вложенного цикла JavaScript

Я пишу простую цепочку, вдохновленную https://stackoverflow.com/a/3834694/721084. Я пытаюсь добиться этого, классифицируя каждый элемент по странице, на которой он будет находиться. Код ниже предназначен для этого, но он всегда заканчивается бесконечным циклом. Что я делаю неправильно?

EDIT: ссылка Pastebin на весь код JS http://pastebin.com/nxUhQmqF

Образец модели:

<ul id="progress_bar" class="nostyle clearfix">
    <li class="first"><a href="">Blah</a></li>
    <li class=""><a href="">Blah</a></li>
    <li class="selected"><a href="">Blah</a></li>
    <li class="last"><a href="">Blah</a></li>
</ul>

JS-код:

    function classifyPages(bcParent, totalItems) {
    var pages       = 1,
        wd          = 0,
        parentWd    = findWidthOfParent(bcParent),
        crumbs      = bcParent.find('li'),
        i           = 0;

    for( i = 0; i < totalItems; i++) {
        wd = 0;
        while(wd < parentWd) {
            crumb = crumbs.eq(i);
            wd += crumb.outerWidth();
            if( wd < parentWd) {
                i += 1;
                crumb.addClass( 'bcPage-' + pages);
            }
        }

        pages += 1;
    }

    return pages;
}

person Aakash Goel    schedule 29.11.2012    source источник
comment
Не могли бы вы показать нам (минимальный) пример DOM и как вы вызываете эту функцию? Кроме того, что возвращает findWidthOfParent?   -  person Bergi    schedule 29.11.2012
comment
Можете ли вы показать нам немного html и как вы вызываете эту функцию?   -  person Cerbrus    schedule 29.11.2012
comment
Вы уверены, что crush.outerWidth возвращает допустимое число? Если нет, он может перейти в бесконечный цикл.   -  person BuddhiP    schedule 29.11.2012
comment
@Bergi: обновил мой вопрос ссылками и DOM   -  person Aakash Goel    schedule 29.11.2012


Ответы (2)


Ваш i, который также увеличивается во внутреннем цикле, в какой-то момент будет превышать totalItems. Тогда несуществующий crumb всегда имеет outerWidth из 0, и вы пойманы (как описал @Oleg V. Volkov).

Это должно работать:

function classifyPages(bcParent, totalItems) {
    var pages       = 1,
        parentWd    = findWidthOfParent(bcParent),
        crumbs      = bcParent.find('li');

    for (var i = 0; i < totalItems; i++) {
        for (var wd = 0; wd < parentWd && i < totalItems; ) {
//                                     ^^^^^^^^^^^^^^^^^
            var crumb = crumbs.eq(i);
            wd += crumb.outerWidth();
            if( wd < parentWd) {
                i += 1;
                crumb.addClass( 'bcPage-' + pages);
            }
        }
        pages += 1;
    }
    return pages;
}

Лучше:

function classifyPages(bcParent, totalItems) {
    var pages       = 1,
        parentWd    = findWidthOfParent(bcParent),
        crumbs      = bcParent.find('li'),
        wd          = 0;

    for (var i = 0; i < totalItems; i++) {
        var crumb = crumbs.eq(i);
        wd += crumb.outerWidth();
        if( wd >= parentWd) {
            pages += 1;
            wd = 0; // reset
        }
        crumb.addClass( 'bcPage-' + pages);
    }
    return pages;
}
person Bergi    schedule 29.11.2012

Я подозреваю, что это while цикл - такие конструкции часто являются источником бесконечных циклов:

 while(wd < parentWd) {
            crumb = crumbs.eq(i);
            wd += crumb.outerWidth();
            // snip

Если crumb.outerWidth() постоянно возвращает 0, это никогда не закончится.

person Oleg V. Volkov    schedule 29.11.2012