2010-04-13 4 views
-1

Может ли кто-нибудь сказать, почему следующая рекурсивная функция не работает для меня? Он должен собирать рекурсивно все переключатели в данном элементе. Но по какой-то причине он не найден!Рекурсия JavaScript не работает должным образом

Спасибо!

<?xml version="1.0" encoding="Windows-1255"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
    <script type="text/javascript"> 
     function AllInputs(radioElement) { 
      this.radioInputs = ((arguments.length == 1) ? [radioElement] : []); 
     } 

     AllInputs.prototype.toString = function() { 
      return "[object AllInputs: radioInputs: " + this.radioInputs.length + "]"; 
     } 

     AllInputs.prototype.add = function(otherAllInputs) { 
      this.radioInputs = this.radioInputs.concat(otherAllInputs.radioInputs); 
     } 

     function getAllInputsOfElement(element) { 
      if (element.tagName.toLowerCase() == "input") { 
       if (element.getAttribute("type").toLowerCase() == "radio") { 
        return new AllInputs(element); 
       } else { 
        return new AllInputs(); 
       } 
      } else { 
       var result = new AllInputs(); 

       for (i = 0; i < element.children.length; i++) { 
        result.add(getAllInputsOfElement(element.children[i])); 
       } 

       return result; 
      } 
     } 

     function main() { 
      alert(getAllInputsOfElement(document.getElementById("MyTable"))); 
     } 
    </script> 
</head> 

<body onload="main()"> 
    <table id="MyTable"> 
     <tr><td>Day</td></tr> 

     <tr><td> 
      <input type="radio" name="DayOfTheWeek" value="1" /><label>Monday</label> 
      <input type="radio" name="DayOfTheWeek" value="2" /><label>Tuesday</label> 
      <input type="radio" name="DayOfTheWeek" value="3" /><label>Wednesday</label> 
     </td></tr> 
    </table> 
</body> 
</html> 

ответ

1

Попробуйте

<?xml version="1.0" encoding="Windows-1255"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
    <script type="text/javascript"> 
     function AllInputs(radioElement) { 
      this.radioInputs = ((arguments.length == 1) ? [radioElement] : []); 
     } 

     AllInputs.prototype.toString = function() { 
      return "[object AllInputs: radioInputs: " + this.radioInputs.length + "]"; 
     } 

     AllInputs.prototype.add = function(otherAllInputs) { 
      this.radioInputs = this.radioInputs.concat(otherAllInputs.radioInputs); 
     } 

     function getAllInputsOfElement(element) { 
      if (element.tagName.toLowerCase() == "input") { 
       if (element.getAttribute("type").toLowerCase() == "radio") { 
        return new AllInputs(element); 
       } else { 
        return new AllInputs(); 
       } 
      } else { 
       var result = new AllInputs(); 
       var noOfChildren = element.children.length; 
       for (var i = 0; i < noOfChildren; i++) { 
        result.add(getAllInputsOfElement(element.children[i])); 
       } 

       return result; 
      } 
     } 

     function main() { 
      alert(getAllInputsOfElement(document.getElementById("MyTable"))); 
     } 
    </script> 
</head> 

<body onload="main()"> 
    <table id="MyTable"> 
     <tr><td>Day</td></tr> 

     <tr><td> 
      <input type="radio" name="DayOfTheWeek" value="1" /><label>Monday</label> 
      <input type="radio" name="DayOfTheWeek" value="2" /><label>Tuesday</label> 
      <input type="radio" name="DayOfTheWeek" value="3" /><label>Wednesday</label> 
     </td></tr> 
    </table> 
</body> 
</html> 

Я не проверяя, что вы пытаетесь решить. Я только что проверил вопрос, который у вас есть.

Это связано с областью действия переменной итерации i в getAllInputsOfElement().

Переменная, которая не объявлена ​​локальной для метода, доступна в глобальной области. Поэтому просто объявите переменную как локальную, используя ключевое слово var.

Попробуйте использовать firefug для любых других инструментов отладки, чтобы проверить выполнение javascript для устранения таких проблем.

Попробуйте поставить некоторые протоколирование сообщений, чтобы узнать путь фактического выполнения и анализировать ее, чтобы найти проблемы с выполнением кода

Надеется, что это решит вашу проблема

+0

Спасибо! Это было действительно полезно. Я посмотрю на «firebug». –

1

У вас очень сложное решение проблемы, которая легко обрабатывается с помощью методов DOM. Попробуйте это вместо:

<?xml version="1.0" encoding="Windows-1255"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
    <script type="text/javascript"> 
     function main() { 
      var inputs = document.getElementById("MyTable").getElementsByTagName("input"); 
      var radios = []; 

      for(var i=0; i<inputs.length; i++) { 
       if (inputs[i].type == "radio") { 
        radios.push(inputs[i]); 
       } 
      } 
      alert("Found " + radios.length + " radio buttons"); 
     } 
    </script> 
</head> 

<body onload="main()"> 
    <table id="MyTable"> 
     <tr><td>Day</td></tr> 

     <tr><td> 
      <input type="radio" name="DayOfTheWeek" value="1" /><label>Monday</label> 
      <input type="radio" name="DayOfTheWeek" value="2" /><label>Tuesday</label> 
      <input type="radio" name="DayOfTheWeek" value="3" /><label>Wednesday</label> 
      <input type="button" value="Nope" /> 
     </td></tr> 
    </table> 
</body> 
</html> 

Это может быть упрощено даже с помощью jQuery.