我正在编写菜单系统,当用户点击特定行时我需要调用一个函数。我正在使用新函数来传递调用函数的div以及用户单击的行。一切顺利,直到我尝试将本地数组传递给函数。如果我执行以下操作:
for (i=0;i<tmpdropnumber;i++){
var dv=document.getElementById(id+i);
dv.style.cursor="pointer";
dv.onmouseover = new Function('dropover'+"('" + id + "','" + i + "')");
dv.onmouseout = new Function('dropout'+"('" + id + "','" + i + "')");
dv.onclick = new Function('dropclick'+"('" + id + "','" + i + "','"+tmparray1+"','"+tmparray2+"')");
}
正如您所期望的那样,数组作为字符串传递。我可以在函数中重建数组,但这似乎不够优雅。
如果我尝试以下内容:
for (i=0;i<tmpdropnumber;i++){
var dv=document.getElementById(id+i);
dv.style.cursor="pointer";
dv.onmouseover = new Function('dropover'+"('" + id + "','" + i + "')");
dv.onmouseout = new Function('dropout'+"('" + id + "','" + i + "')");
dv.onclick = new Function('dropclick'+"('" + id + "','" + i + "',"+tmparray1+","+tmparray2+")");
}
试图传递它崩溃的数组。有关如何实现这一目标的任何想法?我在我的代码中使用jquery,所以javascript或jquery解决方案都没关系。
答案 0 :(得分:1)
而不是
dv.onclick = new Function('dropclick'+"('" + id + "','" + i + "','"+tmparray1+"','"+tmparray2+"')");
试
dv.onclick = function() {
dropclick(id, i, tmparray1, tmparray2);
};
修改强>
将您的声明包装在匿名函数中:
(function(id, i) {
dv.onclick = function() {
dropclick(id, i, tmparray1, tmparray2);
};
} (id, i));
答案 1 :(得分:1)
不要使用新功能。
您遇到了问题,因为在构建字符串时,数组将变为字符串。
绕过toString()
的基本思路for (i=0;i<tmpdropnumber;i++){
var dv=document.getElementById(id+i);
dv.style.cursor="pointer";
(function(id, i){
dv.onmouseover = function(){ dropover(id,i); };
dv.onmouseout = function(){ dropout(id,i); };
dv.onclick = function(){ dropclick(id,i, tmparray1, tmparray2); };
})(id,i);
}
但实际上没有必要传入一个对象,id。
您始终可以使用this
获取当前行,并且表中有rowIndex。你可以在表上有一个事件处理程序,并在表/ tbody上使用处理程序来捕获冒泡并使用target / srcElement。