私が取り組んでいるプロジェクトのために、次のコードを書きました。
var clicky_tracking = [
['related-searches', 'Related Searches'],
['related-stories', 'Related Stories'],
['more-videos', 'More Videos'],
['web-headlines', 'Publication']
];
for (var x = 0, length_x = clicky_tracking.length; x < length_x; x++) {
links = document.getElementById(clicky_tracking[x][0])
.getElementsByTagName('a');
for (var y = 0, length_y = links.length; y < length_y; y++) {
links[y].onclick = (function(name, url) {
return function() {
clicky.log(url, name, 'outbound');
};
}(clicky_tracking[x][1], links[y].href));
}
}
私がやろうとしていることは:
id
2次元配列を定義します。各インスタンスには、属性値(「関連検索」など)と対応する説明(「関連検索」など)の2つの要素を含む内部配列が含まれます。- 内部配列ごとに
document
、対応する属性を持つ要素を見つけて、その中のすべての要素(ハイパーリンク)id
のコレクションを収集します。<a>
onclick
そのコレクションをループし、各ハイパーリンクにハンドラーをアタッチします。このハイパーリンクは、clicky.log
に対応する説明id
(たとえば、id
「related-searches」の「Related Searches」)と要素のhref
属性の値をパラメーターとして渡します。<a>
それがクリックされました。
うまくいけば、それは完全に混乱していませんでした!コードはそれよりも自明かもしれません。
ここで実装したのはクロージャーだと思いますが、JSLintは次のように不平を言います。
http://img.skitch.com/20100526-k1trfr6tpj64iamm8r4jf5rbru.png
だから、私の質問は次のとおりです。
- このコードをリファクタリングしてJSLintを快適にするにはどうすればよいですか?または、さらに良いことに、JSLintの考え方に関係なく、私が見逃しているこれを行うためのベストプラクティスの方法はありますか?
- 代わりに、イベントの委任に依存する必要がありますか?つまり、配列内の属性を持つ要素に
onclick
イベントハンドラーをアタッチしてから、 ?私は以前にそれを行って理論を理解しましたが、詳細については非常に曖昧であり、これが実行可能なアプローチであると仮定して、それがどのように見えるかについてのガイダンスをいただければ幸いです。document
id
event.target
助けてくれてありがとう!