0

这是一个创建面包屑的函数。它最初来自其他人,但我已经对其进行了调整以满足我的需要。现在——我想修复'for(i in bits)'的错误语法,但是当我尝试了我认为可行的方法时,它不起作用。

for (i = 0; i < bits; i++) {etc...};

我以为这行得通,它行不通。这是完整的脚本...

function breadcrumbs() {
'use strict';
/*jslint plusplus:true*/
/*jslint browser:true*/
var sURL, bits, x, stop, output, i, y, chunkStart;
sURL = String();
bits = {};
x = 0;
stop = 0;
output = "";
sURL = location.href;
sURL = sURL.slice(8, sURL.length);
chunkStart = sURL.indexOf("/");
sURL = sURL.slice(chunkStart + 1, sURL.length);
while (!stop) {
    chunkStart = sURL.indexOf("/");
    if (chunkStart !== -1) {
        bits[x] = sURL.slice(0, chunkStart);
        sURL = sURL.slice(chunkStart + 1, sURL.length);
    } else {
        stop = 1;
    }
    x++;
}
for (i in bits) {
    output += "<a href=\"";
    for (y = 1; y < x - i; y++) {
        output += "../";
    }
    bits[i] = decodeURIComponent(bits[i]);
    output += bits[i] + "/\">" + bits[i] + "</a> &nbsp;|&nbsp; ";
}
document.write(output + document.title);
}
4

6 回答 6

3

您需要在以下几行中将与对象相关的代码替换为与数组相关的代码:

// original code                 // fixed code
bits = {};                       bits = [];
for (i in bits) {                for (i = 0; i < bits.length; ++i) {

顺便说一句,您可以使用sURL.split("/")将 URL 拆分为块数组。

于 2012-12-12T20:20:19.587 回答
1

本文探索 JavaScript for-in 循环可能会有所帮助。

你会想使用一个循环,如

for (i = 0; i < bits.length; i++) {
  // stuff.
}

另请参阅此stackover flow JavaScript "For ...in" with Arrays

于 2012-12-12T19:46:16.740 回答
1

Bits 是一个对象({},而不是 [])。For in 将遍历其所有属性。如果你希望它是一个数组位应该初始化为一个数组。您还需要在 for 循环中使用 length 属性。对于 (i = 0;i

于 2012-12-12T19:51:30.880 回答
1

bits是 JavaScript 对象文字而不是数组。您不应该(不能)使用传统的for循环来迭代对象。因此, 的用法for...in是正确的。但是,存在一个错误——循环没有验证对象的属性是否应该被迭代。也就是说,除了对象自己的属性之外,您的循环还遍历原型属性。的正确用法for...in是:

for (prop in bits) {
  if (!bits.hasOwnProperty(prop)) {
    continue;
  }
  // Do something with `bits[prop]`.
}
于 2012-12-12T20:04:07.830 回答
1

for-in 的问题在于它遍历对象的属性。

试试下面的代码。注意:创建 bits 数组的 while 循环已替换为 split & slice,并且简化了面包屑 URL

var sURL = location.href;
// the following line is just for testing...
sURL = "http://testURL.com/one/two/three/four";
var bits = sURL.split('/').slice(3);
var url = "";
var output = ""
for (i = 0; i < bits.length; i++) {
    bit = decodeURIComponent(bits[i]);
    url += "/" + bit;
    output += "<a href=\"" + url + "\">" + bit + "</a> &nbsp;|&nbsp; "
}
document.write(output);
于 2012-12-12T20:24:06.027 回答
0

这是上面迈克答案的扩展/改进。

function breadcrumbs() {
    'use strict';
    /*jslint plusplus:true*/
    /*jslint browser:true*/
    var sURL, bits, bit, url, output, i, n, loc;
    sURL = location.href;
    bits = sURL.split('/').slice(3);
    url = {};
    output = "";
    for (i = 0; i < bits.length; i++) {
        if (bits[i] !== "") {
            bit = decodeURIComponent(bits[i]);
            if (bit.indexOf('.htm') >= 0) {
                n = bit.indexOf('.');
                bit = bit.slice(0, n);
            }//end bit.indexOf
            url += "/" + bit;
            output += "<a href=\"" + url + "\">" + bit + "</a> &nbsp;|&nbsp; ";
        }//end bits[i]
    }//end for bits.length
//  document.write(output);
    loc = document.getElementById('bread');
    loc.innerHTML = output;
}

我添加了两个 if 语句。由于某种原因,.split 将一个空的“”字符串作为最后一个字符串,因此如果当前数组项不是“”,则第一个 if 语句仅执行其余代码。第二个 if 语句删除 .--eg .htm、.html、.html# 之后的任何内容。最后,我摆脱了 document.write(output) 并将其替换为 .innerHTML。这使我可以将脚本从 HTML 的中间取出,并将其移动到在 document.ready 函数调用的底部执行。

于 2012-12-13T01:35:18.943 回答