使用循环分配函数参数

时间:2013-01-15 01:43:23

标签: javascript function loops arguments

我在一段Javascript代码中有一系列列表项。我想为每个人分配一个onclick事件处理程序。每个处理程序都是相同的函数,但具有不同的输入参数。现在我有:

function contentfill(i) {
    box = document.getElementById("text");
    box.style.background="rgba(0,0,0,0.8)";
    var content = new Array();
    contentdivs = document.querySelectorAll("#contentfill>div");
    box.innerHTML = contentdivs[i].innerHTML;
}
li[3].onclick = function() {contentfill(0);};
li[4].onclick = function() {contentfill(1);};
li[5].onclick = function() {contentfill(2);};

这很好用,但我想通过循环实现相同的功能,例如:

for(i=3;i<=5;i++) {
    j=i-3;
    li[i].onclick = function() {contentfill(j);};
}

然而,这不起作用。由于j似乎在循环结束时定义为2,所以每次单击时,它似乎只调用contentfill(2)。

2 个答案:

答案 0 :(得分:3)

对于另一种方法,考虑让每个元素都知道它应该使用什么参数。

for (var i = 0; i < 3; i++) {
    var el = li[i + 3];
    el.dataset.contentIndex = i;
    el.addEventListener('click', contentfill);
}

然后contentfill必须从.dataset中提取参数,而不是采取论证。 (这与jQuery的$.data机制相同。)

我倾向于选择这个,因为它(a)它不会产生大量的小包装,(b)它允许我稍后检查并可能改变“论据”,并且(c)它让我预先定义它们使用data-属性的文档。有效地将它们从函数参数更改为行为。

答案 1 :(得分:1)

i - 3的值应绑定到点击处理函数;闭包可以提供此功能:

li[i].onclick = (function(j) {
    return function() {
        contentfill(j);
    }
)(i - 3));

顺便说一下,最好使用addEventListenerattachEvent注册点击处理程序。