我为我正在处理的项目编写了以下代码:
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
属性的元素,然后收集其中所有<a>
元素(超链接)的集合; - 循环遍历该集合并将
onclick
处理程序附加到每个应该调用的超链接,clicky.log
作为参数传入与“相关搜索”对应的描述id
(例如,“相关搜索”的id
“相关搜索”)和元素的href
属性值<a>
被点击了。
希望这不是完全混乱!代码可能比这更不言自明。
我相信我在这里实现的是一个闭包,但是 JSLint 抱怨:
http://img.skitch.com/20100526-k1trfr6tpj64iamm8r4jf5rbru.png
所以,我的问题是:
- 我怎样才能重构这段代码以使 JSLint 符合要求?或者,更好的是,无论 JSLint 怎么想,是否有一种我错过的最佳实践方法?
- 我应该改用事件委托吗?也就是说,将
onclick
事件处理程序附加到具有我数组document
中的属性的元素id
,然后查看event.target
? 我以前做过一次并且理解了这个理论,但是我对细节很模糊,并且希望得到一些关于它是什么样子的指导——假设这是一种可行的方法。
非常感谢您的帮助!