2011-04-12 40 views
1

我正在为一个客户端项目(一个非常老的人复活)工作。Javascript,又一个“太多的递归”问题:邪恶eval的复仇()

当我浏览在Firefox项目的JSP中的一个(4.0在这种情况下,但我想这与3.X也发生),Firebug的控制台上会出现以下错误:

Error: too much recursion
Archivo fuente: https://localhost:9443/ClientProjectWeb/js/Object.js
Línea: 226

这里是该行的代码片断:

if(gControl){giveFocusToControl(gControl.name);} 

这是调用函数:

function giveFocusToControl(nombreControl){ 
    var forma = document.forms[0]; 
    var campo = null; 
    if(forma){ 
     var elemento = eval("forma."+nombreControl); 
     if(eval(elemento.length)){ 
      if(elemento.type == "select-one" || elemento.type == "select-multiple"){ 
       campo = elemento; 
      }else{ 
       campo = elemento[0]; 
      } 
     }else{ 
      campo = elemento; 
     } 

     if(campo.style && campo.style.visibility){ 
      if(campo.style.visibility != "hidden"){ 
       campo.focus(); 
      } 
     }else{ 
      campo.focus();   
     } 
    } 
} 

我怀疑这与函数内部的eval()调用有关,但尽管我试图用this document中提出的[]替代替换这些“邪恶”调用,例如:var elemento = forma[nombreControl];,但我没有得到预期的结果,错误仍然存在:同一行,同一条消息。

请问您有什么建议吗?提前致谢。

+0

if(gControl)giveFocusToControl(gControl.name);}看起来像什么代码? – dlev 2011-04-12 17:48:32

+3

在表单或表单元素的焦点上调用'giveFocusToControl'吗?如果是这样的话,可能会发生,因为这个函数在'campo.focus()'重复调用' – mVChr 2011-04-12 17:50:51

回答

2

campo.focus()是我开始调查的地方。我会在每次都到campo.focus()之前发出警报,并检查警报是否被多次调用。如果是这种情况,则需要考虑调用giveFocusToContol()方法的位置。这种方法中的eval调用并不是必须的。没有玩代码,我会说第一个eval可以替换为forma.controls[nombeControl];我肯定会玩第二个电话以获得评估它的最佳方式。 if(eval(elemento.length))的目的基本上是一个测试,看看有问题的控件是否是一个列表。

+2

您可以用'if(elemento instanceof Array)'替换'if(eval(elemento.length))'或者使用['.isArray()'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray)(或jQuery的['.isisray()'](http:// api。 jquery.com/jQuery.isArray/)) – 2011-04-12 18:06:55

+0

'forma.controls'是未定义的,所以我尝试了'forma.elements',这似乎是好的。谢谢。 – 2011-04-12 19:39:53

+0

@Rocket:'if(elemento instanceof Array)'似乎没问题。谢谢。 – 2011-04-12 19:40:46