我寫了一個項目,下面的代碼,我的工作:如何重構此JavaScript代碼以避免在循環中生成函數?
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
屬性值(例如「相關搜索」)和相應的描述(例如「相關搜索」); - 對於每個內部數組,找到
document
中的元素以及相應的id
屬性,然後收集其中所有元素(超鏈接)的集合; - 遍歷該集合並附加
onclick
處理程序每個超鏈接,這應該調用clicky.log
,傳遞作爲參數的對應於id
(例如,「相關搜索」爲id
「相關的搜索」)的描述和被點擊的<a>
元素的href
屬性的值。
希望這不是完全混淆!代碼可能比這更明顯。
我相信,我在這裏實行的是封閉的,但JSLint的抱怨:
http://img.skitch.com/20100526-k1trfr6tpj64iamm8r4jf5rbru.png
所以,我的問題是:
- 我如何重構這個代碼,以JSLint是否合適?或者,更好的是,有沒有一種最佳實踐方式可以做到這一點,而不管JSLint認爲什麼?
- 我應該依靠事件委派嗎?也就是說,將
onclick
事件處理程序附加到document
元素中,id
屬性位於我的陣列中,然後查看event.target
?我以前曾經這樣做過,理解這個理論,但是我對這些細節很朦朧,並且希望得到一些關於什麼樣的指導 - 假設這是一種可行的方法。
非常感謝您的幫助!
謝謝,Anurag!對此,我真的非常感激。這看起來不錯。 – Bungle 2010-05-26 07:09:52
謝謝@Bungle。很高興你發現它有幫助。乾杯! – Anurag 2010-05-26 07:27:09