2013-02-15 53 views
0

我在写一个菜单系统,当用户点击一个特定的行时,我需要调用一个函数。我正在使用新函数来传递称为函数的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解决方案将罚款。取而代之的

dv.onclick = new Function('dropclick'+"('" + id + "','" + i + "','"+tmparray1+"','"+tmparray2+"')"); 

+0

因为它在构建字符串时使用toString()。 – epascarello 2013-02-15 16:02:11

+1

在一个简单的词:[json](http://www.json.org/) – 2013-02-15 16:02:22

+0

我正在做一个客户下拉式菜单。我使用循环添加了一堆div,并在创建时附加onclick函数。因此,当用户点击我的功能知道哪一行被点击。总是使用字符串只是不能传递数组(或对象),因为新函数似乎只能传递字符串。 – Kage 2013-02-15 16:07:05

回答

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。

+0

对不起。没有解释 - 我实际上并没有使用表格。我知道如何获得行参考。我需要像素完美的精度,所以建立一个像divs – Kage 2013-02-15 16:16:05

+0

结构的表感谢你 - 看起来正是我所需要的。我不太了解匿名函数包装器。为什么我的变量id和我在函数后面引用,而不是数组? – Kage 2013-02-15 16:20:28

+0

辉煌 - 完美工作 – Kage 2013-02-15 17:04:41

1

尝试

dv.onclick = function() { 
    dropclick(id, i, tmparray1, tmparray2); 
}; 

编辑

包装你声明的匿名函数:

(function(id, i) { 
    dv.onclick = function() { 
     dropclick(id, i, tmparray1, tmparray2); 
    }; 
} (id, i)); 
+1

这不会在运行时为我提供正确的引用。我总是显示它的最后价值。 – Kage 2013-02-15 16:05:12

+0

@ Kage:是的,你说得对。我修复了我的回答 – Amberlamps 2013-02-15 16:07:30

+0

喜欢这样的表情 - 会试着让你知道 – Kage 2013-02-15 16:14:05