Javascript生成的表无法正常工作

时间:2013-06-19 11:47:21

标签: javascript html arrays for-loop html-table

有人能发现明显错误吗?为什么这个Javascript生成的表(showResults函数)没有显示在我的html中?当我有很多引用的文字值时,总会发生这种情况...我也很感激我的格式(白色空间)上的任何其他评论!

   <script type="text/javascript"> 
    //calculates sum of all values within an array
   function totalVotes(votes){  /
        var total=0;
        for (i=0;i<votes.length;i++){
        total = votes[i] + total;
        }
        return total;
    }
    //calculates a percentage, rounded to nearest integer
    function calcPercent(item, sum){    
        return Math.round((item/sum)*100);
    }
    //tests value of partyType parameter        
   function createBar(partyType, percent){   
        switch (partyType){
            case D:  barText="<td class='dem'></td>";
            break;
            case R:  barText="<td class='rep'></td>";
            break;
            case I:  barText="<td class='ind'></td>";
            break;
            case G:  barText="<td class='green'></td>";
            break;
            case L:  barText="<td class='lib'></td>";
            break;
        }
        for(i=1;i<=percent;i++){    
            document.write(barText);
        }
    }
    function showResults(race,name,party,votes){
        var totalV=function totalVotes(votes);

        document.write("<h2>" +race+ "</h2>");
        document.write("<table cellspacing='0'>");
        document.write("<tr>");
        document.write("<th>Candidate</th>");
        document.write("<th class='num'> Votes</th>");
        document.write("<th class='num'>%</th>");
        document.write("</tr>");

        for (r=0;r<name.length;r++){
            document.write("<tr>");
            document.write("<td>"+name[i]+ '(' +party[r]+ ")" +"</td>");
            document.write("<td class='num'>" +votes[r]+ "</td>");

            var percent=function calPercent(votes[r],totalV)
            document.write("<td class='num'>(" +percent[r]+ "%)</td>");
            createBar(party[r], percent);
            document.write("</tr>");
        }   
        document.write("</table>");
    }

3 个答案:

答案 0 :(得分:3)

我认为你需要在与字符串Hence D is not same as "D".

进行比较时给出引号
  switch (partyType){
            case "D":  barText="<td class='dem'></td>";
            break;
            case "R":  barText="<td class='rep'></td>";
            .......

正如其他人所建议的那样,在调用它时删除函数关键字。

var totalV = function totalVotes(votes);

应该是

  var totalV = totalVotes(votes);

答案 1 :(得分:1)

1)在案例陈述中使用引号:case "D"case "R",...

2)使用innerHTML方法代替document.write。只使用一个串联字符串而不是for循环内部。

3)var totalV = function totalVotes(votes);会引发错误:也许您可能想写var totalV = totalVotes(votes);

4)barText未在任何地方定义(首先使用var声明它)


如果您还对通用建议感兴趣,可以使用对象查找来避免整个开关

function createBar(partyType, percent){   

    var cells     = "",
        cellclass = { 
          "D": "dem", "R": "rem", "I": "ind", "G": "green", "L": "lib" 
        }[partyType];


    for(var i = 1; i <= percent.length; i++){    
        cells += "<td class='" +  cellclass + "'></td>"
    }

    <yourtablerow>.innerHTML = cells; // <yourtablerow> is a reference to a table row.
}

答案 2 :(得分:1)

您的代码存在许多问题:

  1. totalVotes函数

  2. 的左括号后随机斜杠
  3. 使用for-loops声明一个没有var的变量(这不会破坏您的代码,但这样做并不是一个好主意)

  4. 正如其他人所述,错误使用switch语句(非数字字符需要在引号中)

  5. 正如Fabrizio Calderan所说,barText设置不正确。它工作,但这是非常糟糕的做法。在切换之前先声明它。

  6. createBar中的for循环将根据您传递给它的内容不起作用。您在percent内的for循环中将数组作为showResults的值传递,但通过将其与数字进行比较,将其视为数字。您希望在for循环中使用percent.length

  7. 访问函数的方法不正确。 var totalV=function totalVotes(votes);无效,无效。或者使用var totalV=totalVotes(votes);或者如果您不想使用var totalV=totalVotes.call(null, votes);(尽管您不需要在代码中使用.call属性)

  8. showResults函数中for循环内的另一个错误。 var percent=function calPercent(votes[r],totalV)将问题视为我的#6点,错误地访问了一个函数,并且该函数由于拼写错误而实际上不存在。很确定你的意思是var percent=calcPercent(votes[r],totalV)

  9. 我不是document.write方法的粉丝,并且没有长时间使用它。我个人不惜一切代价避免它,因为它的工作方式/编写地点。同样,Fabrizio建议,innerHTML是一个更好的选择。

  10. 总的来说,代码很干净,大部分都可以工作,但我觉得你甚至没有尝试在启用调试器的情况下运行代码。 Firefox和Chrome都有一个不错的原生调试器,可以发现这些错误。

    尽管如此,我已经修复了这些问题的代码。还有一些其他的变化可以使代码更好/更小/更简单,但我认为现在这样做。

    <script type="text/javascript"> 
        //calculates sum of all values within an array
        function totalVotes(votes)
        {
            var total=0;
            for (var i=0; i < votes.length; i++){
                total = votes[i] + total;
            }
            return total;
        }
        //calculates a percentage, rounded to nearest integer
        function calcPercent(item, sum)
        {
            return Math.round((item/sum)*100);
        }
        //tests value of partyType parameter        
        function createBar(partyType, percent)
        {
            var barText = null;
            switch (partyType)
            {
                case 'D':  barText="<td class='dem'></td>";
                break;
                case 'R':  barText="<td class='rep'></td>";
                break;
                case 'I':  barText="<td class='ind'></td>";
                break;
                case 'G':  barText="<td class='green'></td>";
                break;
                case 'L':  barText="<td class='lib'></td>";
                break;
            }
            var result = "";
            for(var i=1;i<percent.length;i++)
            {
                result += barText;
            }
            return result;
        }
        function showResults(race,name,party,votes)
        {
            var totalV=totalVotes(votes);
            var result = "";
    
            result += "<h2>" +race+ "</h2>";
            result += "<table cellspacing='0'>";
            result += "<tr>";
            result += "<th>Candidate</th>";
            result += "<th class='num'> Votes</th>";
            result += "<th class='num'>%</th>";
            result += "</tr>";
    
            var percent = 0;
            for (var r=0; r < name.length; r++){
                result += "<tr>";
                result += "<td>"+name[i]+ '(' +party[r]+ ")" +"</td>";
                result += "<td class='num'>" +votes[r]+ "</td>";
    
                percent = calcPercent(votes[r],totalV)
                result += "<td class='num'>(" +percent[r]+ "%)</td>";
                result += createBar(party[r], percent);
                result += "</tr>";
            }
            result += "</table>";
    
            document.body.innerHTML = result; // or document.write(result) if you prefer
        }
    </script>