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.
}

このスタックオーバーフローJavaScript「For...in」と配列も参照してください。

于 2012-12-12T19:46:16.740 に答える
1

for-inの問題は、オブジェクトのプロパティを反復処理することです。

次のコードを試してください。注:ビット配列を作成した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 に答える
1

ビットはオブジェクトです([]ではなく{})。inは、そのすべてのプロパティを繰り返し処理します。配列にしたい場合は、ビットを配列として初期化する必要があります。また、forループでlengthプロパティを使用する必要があります。for(i = 0; i

于 2012-12-12T19:51:30.880 に答える
1

あなたbitsはJavaScriptオブジェクトリテラルであり、配列ではありません。for従来のループを使用してオブジェクトを反復することはできません(できません) 。したがって、の使用法for...inは正しいです。ただし、1つの間違いがあります。ループは、オブジェクトのプロパティが繰り返される必要があるプロパティであることを確認しません。つまり、ループは、オブジェクト自体のプロパティに加えて、プロトタイプのプロパティを反復処理しています。の正しい使用法はfor...in次のとおりです。

for (prop in bits) {
  if (!bits.hasOwnProperty(prop)) {
    continue;
  }
  // Do something with `bits[prop]`.
}
于 2012-12-12T20:04:07.830 に答える
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;
}

2つのifステートメントを追加しました。何らかの理由で、.splitは最後の文字列として空の ""文字列をプルしているため、最初のifステートメントは、現在の配列項目が ""でない場合にのみ、残りのコードを実行します。2番目のifステートメントは、.-- eg .htm、.html、.html#の後のすべてを削除します。最後に、document.write(output)を削除し、.innerHTMLに置き換えました。これにより、スクリプトをHTMLの途中から取り出して、document.ready関数呼び出しの下部で実行するように移動することができました。

于 2012-12-13T01:35:18.943 に答える