有人能发现明显错误吗?为什么这个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>");
}
答案 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)
您的代码存在许多问题:
在totalVotes
函数
使用for-loops声明一个没有var
的变量(这不会破坏您的代码,但这样做并不是一个好主意)
正如其他人所述,错误使用switch语句(非数字字符需要在引号中)
正如Fabrizio Calderan所说,barText
设置不正确。它将工作,但这是非常糟糕的做法。在切换之前先声明它。
createBar
中的for循环将根据您传递给它的内容不起作用。您在percent
内的for循环中将数组作为showResults
的值传递,但通过将其与数字进行比较,将其视为数字。您希望在for循环中使用percent.length
。
访问函数的方法不正确。 var totalV=function totalVotes(votes);
无效,无效。或者使用var totalV=totalVotes(votes);
或者如果您不想使用var totalV=totalVotes.call(null, votes);
(尽管您不需要在代码中使用.call
属性)
showResults
函数中for循环内的另一个错误。 var percent=function calPercent(votes[r],totalV)
将问题视为我的#6点,错误地访问了一个函数,并且该函数由于拼写错误而实际上不存在。很确定你的意思是var percent=calcPercent(votes[r],totalV)
。
我不是document.write
方法的粉丝,并且没有长时间使用它。我个人不惜一切代价避免它,因为它的工作方式/编写地点。同样,Fabrizio建议,innerHTML
是一个更好的选择。
总的来说,代码很干净,大部分都可以工作,但我觉得你甚至没有尝试在启用调试器的情况下运行代码。 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>