0

こんにちは、javascript を使用して、href が空であるか、ページにないことを確認する必要があります。サイトを検索していくつかの例を見つけましたが、うまくいきませんでした。気づかなかった何かを見逃さなければなりません。誰かが私に良い方向と私の間違いを指摘してくれますか. エラーが発生しました" Unable to get property 'getattribute' of undefined or null reference.<a>要素は<a name="playback" href="">html ファイルのようなものです。

前もって感謝します。

ロードイベントで実行される私のコードがあります:

var anchors = document.getElementsByTagName("a");
for (var i = 0; i < anchors.length; i++)
{
     anchors[i].onclick = function() {
         if (anchors == null) {
             alert('null');
         }
         else {
             var link = anchors[i].getAttribute("href");
            //var link= anchors[i].attributes['href']  this line doesn't work too.
             }
        }
    }
}
4

5 に答える 5

1

スコープに問題があります。次のコードは3を出力します。

for (var i = 0; i < 3; i++) {
}
console.log(i); // 3

上記の例と同様に、ループが完了onclickした後に実行されます。
したがってi、あなたの例では に等しくなりanchors.lengthます。

そしてanchors[anchors.length] === undefined

この問題を解決するには、新しいスコープを作成する必要があります。
たとえば、すぐに呼び出される関数式 (IIFE) を使用できます。

var anchors = document.getElementsByTagName("a");
for (var i = 0; i < anchors.length; i++)
{
    (function(j){
       anchors[j].onclick = function() {
         if (anchors == null) {
             alert('null');
         }
         else {
             var link = anchors[j].getAttribute("href");
             }
        }
      }
    }(i));
}
于 2013-11-12T22:47:20.230 に答える
1

コードでは、への呼び出しgetAttributeは、リンクの onlick イベント ハンドラーに割り当てられたクロージャー (つまり、名前なしで "インライン" で定義された関数) 内にあります。したがって、そのコードはすぐには実行されません - onclick ハンドラーがトリガーされる前に実行されません。
onclick ヘッダーがトリガーされると、2 つのものがコールバック関数に渡されます。イベントがトリガーされた要素がthis関数コンテキストの変数に割り当てられ、イベント自体が最初のパラメーターとして渡されます。anchorsただし、そのコールバックのスコープでは定義されていません。

したがって、次のいずれかを使用します。

anchors[i].onclick = function () {
    var link = this.getAtrribute("href");
}

 

anchors[i].onclick = function (event) {
   var link = event.target.getAttribute("href");
}
于 2013-11-12T22:51:44.467 に答える
0

getAttribute を見たことがないので、いくつかのテストを実行しました。hrefgetAttribute("href")はかなり異なっていることがわかります。つまりhref、絶対 URL でありgetAttribute("href")、ページへの相対 URL です。このフィドルを参照してください。

コードの問題は、var が onclick のクロージャでキャプチャされ、onclick 関数が実行されると値が will にiなることanchors.lengthです。

解決策、ヒスのコードを使ったスクラッチJohannes H.の方がいい

var anchors = document.getElementsByTagName("a");
for (var i = 0; i < anchors.length; i++) {
  (function () {
    var current = anchors[i]; //Capture the anchor element
    current.onclick = function() {
     var link = current.getAttribute("href");
    };
  } ());
}
于 2013-11-12T22:52:33.113 に答える