2011-04-12 21 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