1

当用户单击 HTML 表中的单元格时,我试图注册一个匿名函数。下面是一些原始的、纯粹的代码:

document.getElementById(
    "course"+displayed_year_index+occurrences_indices[displayed_year_index]).onclick =
        eval("function() {PrintReceipt("+result.years[result_year_index].rul_code+");};");

注意使用eval, 因为它位于一个循环中,并且匿名函数每次都不同。

可以说,这在 Firefox 2 中工作得非常好。但是,Firefox 3 会抛出一个“语法错误”,指向“函数”一词之后的括号内。

有人对我如何解决这个问题有任何聪明的想法吗?


为了清楚地说明我正在尝试做什么,这里有一个非常简化的示例:

for (index=0; index<4; index++) {
    document.getElementById("div"+index).onclick = 
        eval("function () {Foo(index);};");
}

换句话说,我希望用不同的参数值来触发相同的函数div

4

4 回答 4

5

你有没有尝试过这样的事情?

document.getElementById('course' + displayed_year_index + occurences_indices[displayed_year_index]) =
    function (nr)
    {
        return function () { PrintReceipt(nr) }
    } (result.years[result_year_index].rul_code);

您能否发布循环以帮助我们找到问题,而不是让我们猜测您要做什么?

于 2008-11-17T14:22:42.810 回答
4

恕我直言,在这种情况下不应该使用闭包,也不需要为每个 onlick 创建一个新函数(使用比必要更多的内存),而 eval 是错误的答案。

您知道您使用 getElementById 获得的元素是一个对象,并且您可以为其赋值吗?

for ( /* your definition */ ) {
  var e = document.getElementById(
    "course"+displayed_year_index+occurrences_indices[displayed_year_index]
  );
  e.rul_code = result.years[result_year_index].rul_code;
  e.onclick = PrintReceipt;
}

但是您应该首先定义 PrintReceipt:

function PrintReceipt() {
  //This function is called as an onclick handler, and "this" is a reference to the element that was clicked.
  if (this.rul_code === undefined) { return; }
  //Do what you want with this.rul_code
  alert (this.rul_code);
}
于 2008-11-17T17:28:30.017 回答
1

使用 Tom 建议的闭包。

这是 John Resig 的一个很好的解释:闭包的工作原理(pdf)

于 2008-11-17T15:39:34.263 回答
0

这似乎是你想要去的方向:

document.getElementById("course"+displayed_year_index+occurrences_indices[displayed_year_index]).addeventlistener("click",  function() {
    var current_rul_code = result.years[result_year_index].rul_code;
    PrintReceipt(current_rul_code);
}, true);

这应该会导致在不同的范围内创建每个 onclick 事件(循环的每次迭代)。 闭包将负责其余的工作。

于 2008-11-17T14:35:17.903 回答