1

リンクを動的に生成する Web サイトがあります。外部リンクを追跡する onclick イベント ハンドラーを追加できるかどうかを確認したいと思います。target="new" (サイトの外部を意味する) を含むリンクを確認し、イベント ハンドラーを追加することを検討しています。

htmlコード

 <a target="new" href="http://twitter.com/cnn">CNN</a>

テストしようとしたコードが機能しません。コードのどこが間違っているか教えてください。または、onclick イベントを外部リンクに追加する必要がありますか?

JSコード

var links = document.getElementsByTagName("a");
for (var i=0; <links.length; i++) { 
    if(links[i].target == 'new'){   
        links[i].onclick = function() {
            alert("Added onClick: " + links[i].href);        
        }
    }
}                                               
4

3 に答える 3

1

thisonclick 関数で使用して、閉鎖の問題を回避できます

var links = document.getElementsByTagName("a");
for (var i=0; i<links.length; i++) { 
    if(links[i].target == 'new'){   
        links[i].onclick = function(){  
            alert("Added onClick: " + this.href);           
        }
    }
}                                               
于 2012-08-03T23:27:37.333 に答える
1

ここでの別の答えは、(これを使用して)何をすべきかですが、 for ループのクロージャーの問題に対処する価値があります。

その for ループで作成されたクロージャで for ループの反復ごとに変化する変数を使用する場合は、 onclick イベントにバインド (バインド?) される関数を返す無名関数を定義して呼び出します。

var links = document.getElementsByTagName("a");
for (var i=0; i<links.length; i++) { 
    if(links[i].target == 'new'){   
        links[i].onclick =
            function (obj) {
                return function(event) {
                    alert("Added onClick: " + obj.href);        
                }                   
            }(links[i]);
    }
}

無名関数へのパラメーター (obj) は値渡しされるため、for ループの後続の反復では変更されません。返された関数には、オブジェクトの独自のコピーがあります。

関数を受け渡し可能なオブジェクトと考えると、Javascript の多くの機能が理解できるようになります。

于 2012-08-03T23:49:01.157 に答える
0

あなたはjQueryに反対ですか?

$("a[target='new']").click(function(){alert($(this).attr("href"));});
于 2012-08-03T23:34:37.527 に答える