当用户单击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
使用不同的参数值触发相同的函数。
答案 0 :(得分: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);
您能否发布循环以帮助我们找到问题,而不是让我们猜测您正在尝试做什么?
答案 1 :(得分:4)
在这种情况下不应该使用IMHO闭包,并且不需要为每个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);
}
答案 2 :(得分:1)
使用Tom建议的闭包。
John Resig给出了一个很好的解释:How Closures Work(pdf)
答案 3 :(得分: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事件在不同的范围内创建(循环的每次迭代)。 Closures会照顾其他人。