【发布时间】:2017-12-19 03:50:15
【问题描述】:
我想创建一个分层薪酬计算器实用程序。
在我的 Javascript 文件中,我从文本输入字段中的名称列表中动态地将行和字段添加到使用 HTML 创建的表中。这些行由一个名称标签列、一个用于输入总收入的文本输入列和一个计算的薪酬输出列组成。
我希望它在我更改总收入列中的文本输入时自动更新计算的工资列。尽管我可以将元素 ID 跟踪到 calculatePay 函数,但我似乎无法使用或设置它们的属性。我觉得它们也不是独一无二的。有什么想法吗?
顺便说一句,您必须立即单击更新按钮才能运行 Javascript。
编辑 - 根据建议进行了一些更改。似乎仍然无法将变量传递给 calculatePay 函数,然后简单地将它们转过来并将它们吐回我表的 Pay 列中。
编辑 - 已解决。问题是关闭,起初我不明白,但这里是瘦的。为了隔离变量的范围,这样它们就不会在每次循环出现时都被重新编写,它们需要在每次循环迭代时重新创建的函数中声明(因为 Javascript 的作用域是函数而不是代码块)。注意事项 - 如果您只是在循环中间声明一个无名函数,这将不起作用。您必须将其返回给变量(即var buildElement = function(){Yada Yada}();)。另外,在函数后面加上()来执行。
Javascript
function buildTable(){
var artists = document.getElementById("artlist").value;
var names = artists.split(",");
var len = names.length;
var ptable = document.getElementById("payTable");
var rowLength = ptable.rows.length;
for (i=0 ; i < len; i++){
var buildElement = function(){
var row = ptable.insertRow(rowLength);
var nameCell = row.insertCell(0);
var grossCell = row.insertCell(1);
var payCell = row.insertCell(2);
var grossText = document.createElement("input");
grossText.type = "type";
grossText.name = "gtext[]";
grossText.id = "gross" + names[i];
payCell.id = "pay" + names[i];
grossText.onchange = function(){calculatePay(payCell.id, grossText.id);};
grossCell.appendChild(grossText);
nameCell.innerHTML = names[i];
}();
}
}
function resetTable(){
var ptable = document.getElementById("payTable");
var rowLength = ptable.rows.length;
if (rowLength>2){
for (p=rowLength; p>2; p--){
ptable.deleteRow(2);
}
}
buildTable();
}
function calculatePay(target, gross) {
document.getElementById(target).innerHTML = document.getElementById(gross).value;
}
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<script src="./js/script.js"></script>
<link rel="stylesheet" href="./css/style.css" />
</head>
<body>
<div>
<table id="payTable">
<tr>
<th colspan=3 class="hdr">
Calculator
</th>
</tr>
<tr>
<th class="hdr">
Name
</th>
<th class="hdr">
Gross
</th>
<th class="hdr">
Pay
</th>
</tr>
</table>
</div>
<div>
<table>
<tr>
<th colspan=3 class="hdr">
SETTINGS
</th>
</tr>
<tr>
<th colspan=3 class="hdr">
Breakpoints
</th>
</tr>
<tr>
<td>Break 1 at $
<input type="text" name="break1" id="break1" value="300"/>
</td>
<td>
</td>
<td>Break 2 at $
<input type="text" name="break2" id="break2" value="900"/>
</td>
</tr>
<tr>
<th colspan=3 class="hdr">
Percentage levels
</th>
</tr>
<tr>
<td>
Below break 1:
<input type="text" size="4" name="per1" id="per1" value="50"/>%
</td>
<td>
Between breaks 1 and 2:
<input type="text" size="4" name="per2" id="per2" value="60"/>%
</td>
<td>
Over break 2:
<input type="text" size="4" name="per3" id="per3" value="70"/>%
</td>
</tr>
<tr>
<td>
Artists:
<input type="text" name="artlist" id="artlist" value="Brian,Eric,Christie,Cynthia,Shawn"/>
</td>
<td>
</td>
<td class="hdr">
<button onclick="resetTable()">Update</button>
</td>
</tr>
</div>
</body>
</html>
【问题讨论】:
-
提示:请使用段落。它使事情更容易阅读。
-
能否发布您的 HTML,以便我可以测试上面的 sn-p。
-
投票关闭 - 请参阅帮助:包含足够的代码以允许其他人重现该问题。如需帮助,请阅读如何创建最小、完整、有效的示例。没有一个可行的例子就做不了什么。
-
@MelanciaUK 请再看看。我做了一些修改。
-
不要在问题帖子中保留您的解决方案...我建议您使用您获得的解决方案回答您自己的问题,以便其他人更容易看到它:)
标签: javascript html dynamic html-table parameter-passing