我写了一个项目,下面的代码,我的工作:如何重构此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