0

私はWeb開発とJavaScriptにかなり慣れていません。私のウェブサイトの管理を少し簡単にするために、Javascript を使用してテキスト ファイルから読み取った「ナビゲーション バー」を作成し、各ページの上部に追加することにしました。私が今やろうとしているのは、リンクと「リンクの深さ」を指定してページへの相対リンクを返すことができる関数を作成することです。関数は次のとおりです。

 function increaseLinkDepth(aLink, aDepth) {
     var result = aLink;
     for(i = 0;i < aDepth;i++) {
         result = "../" + result;
     }
     return result;
 } 

現在、私はデスクトップおよびモバイル デバイスでの開発経験が少しあるので、これは非常に単純な機能です。このように関数を呼び出すと: /increaseLinkDepth("index.html", 1)、次の結果が得られると予想されます: ../index.html。サイトでJavaScriptを実行すると、それが得られます。ここで、次のコードで関数を呼び出すと:

 var anchors = document.getElementsByTagName("a");
    for(i = 0;i < anchors.length;i++) {
        var lAnchor = anchors[i];
        var lAnchorLink = lAnchor.getAttribute("href");
        if(lAnchorLink.substring(0, 4) != "http") {
            var newLink = increaseLinkDepth(lAnchorLink, 1);
            //alert(newLink);
            lAnchor.setAttribute("href", newLink);
        }
    }

何らかの無限ループに陥り、ブラウザを再起動する必要があります。探しているリンクは次のとおりです。

  • index.html
  • events.html
  • about.html

3 つすべてが見つかりますが、about.html リンクでループが発生します。コードに何かが欠けているかどうかはわかりません (おそらく、コードを長時間見すぎている可能性があります)。しかし、この問題がどこにあるのかわかりません。

今、これがこれを達成するための最良の方法ではないかもしれないことを理解しています.そうでない場合は、お知らせください.HTMLを変更する必要のないナビゲーションバーを作成するには、これが唯一の方法だと思います.すべてのページ。

4

3 に答える 3

0

var を使用してローカル変数として宣言せずに「i」への代入を使用しています。JavaScript では、これによりグローバル変数が作成されます。つまり、両方の関数が同じインデクサーを使用しています。

各関数の先頭に a を追加var i;すれば問題ありません。

于 2013-09-03T14:35:22.003 に答える
0

変数を宣言するときに var キーワードを使用するのを忘れると、デフォルトでグローバル スコープになります。あなたの場合、問題は両方の方法でグローバルスコープから同じ変数を参照する i 変数にあります。短い疑似コードでは、あなたがしていることは次のとおりです。

for (i=0; i<n; i++) {
  for (i=0; i<m; i++) {
    doStuff();
  }
}

コードを次の行に沿って変更します。

function increaseLinkDepth(aLink, aDepth) {
     var result = aLink;
     for(var i = 0;i < aDepth;i++) {
         result = "../" + result;
     }
     return result;
 } 

詳細はこちら: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

于 2013-09-03T14:36:03.383 に答える