动态生成带闭包的js按钮,分配onclick函数参数

时间:2015-01-13 05:00:51

标签: javascript dom closures

我遇到了人们之前发布过的问题:JavaScript dynamic parameters

但我的代码使用节点而不是innerHTML赋值,因此现有的SO帖子似乎不适用于我的代码。

我想在表格中动态生成HTML按钮。对于每个按钮,我想调用一个函数,该函数的参数取决于表中按钮的索引/位置。首先,我尝试使用lambda函数和我正在递增的变量。这不起作用,所以我也尝试了动态命名变量,这意味着每个按钮应该传递一个不同命名的变量来处理延迟加载效果。但这也不起作用。您可以在下面的代码中看到我尝试过的两个版本:

我在下面粘贴的代码是for-loop。在下面,我每次增加1。 offset和jj在循环中保持不变。

var variableDynamic = i.toString();
window['variableName' + variableDynamic] = i + offset;

upvote.onclick = function() {
    upVoteA(i + offset, jj);
    //upVoteA(window['variableName' + variableDynamic] , jj);
};
upvote.innerHTML = "Upvote"

有人告诉我调查闭包,所以遵循这个建议:http://www.usepatterns.com/blog/javascript-closures我重写了onclick函数声明:

upvote.onclick = function() {
    var a = i + offset;
    var b = kk;
    function closeIt(){
        upVoteA(a,b);
    }
    closeIt();
};

这仍然具有相同的效果,即每个按钮使用相同的参数调用upVoteA,即最后/最高值。

我意识到我可以重构我的代码以将它们转换为.innerHTML set语句然后我打印变量并将其设置为打印语句而不是延迟加载的变量。但如果可能的话,我不想这样做。 (道歉,这不是技术上的延迟加载,这个名字似乎相当合适)

有没有办法让我的代码工作?为什么关闭失败?我认为闭包应该保留它们创建的环境,但我的代码却不是这样。 “闭环”中保留了“环境”的哪一部分?

1 个答案:

答案 0 :(得分:0)

这是一个非常糟糕的答案,但它有效

     var funcStr = "function dummy() { upVoteA(" + (i + offset) + "," + jj + "); }";
     eval(funcStr);
     upvote.onclick = dummy;

但如果你有更好的东西,请告诉我。