我正在编写一个受https://stackoverflow.com/a/3834694/721084启发的简单面包屑。我是如何尝试实现这一目标的,方法是按页面对每个项目进行分类。下面的代码是为了做到这一点,但它总是以无限循环结束。我做错了什么?
编辑:粘贴到整个JS代码http://pastebin.com/nxUhQmqF
的链接示例DOM:
<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;
}
答案 0 :(得分:1)
我怀疑这个while
循环 - 这样的结构经常恰好是无限循环的来源:
while(wd < parentWd) {
crumb = crumbs.eq(i);
wd += crumb.outerWidth();
// snip
如果crumb.outerWidth()
始终返回0,则永远不会结束。
答案 1 :(得分:1)
您的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;
}