0

你能帮我解释一下为什么我的工作工资计算功能在这段代码中不起作用吗?(在我添加“Do while”循环之前它工作得很好。)

我想要的是首先从数据库中检索工资金额,然后该用户可以输入其他费用并对每个生成的记录进行报酬。当用户得到满意的结果时,他可以将其保存回数据库。

谢谢,

我的代码如下:

<%
Do while Not Rs.EOF

if rs.fields.item("if_social_sec") = "True"  then
    displaytxt = "" 
    soc_sec_v = soc_sec
else
    displaytxt = "none"
    soc_sec_v = 0
end if 
%>

<table>
<form name="myform2" action="salary_action.asp" method="POST">

<tr bgcolor="#<%=color%>"> 
<td class="btline" width="25" align="center"><input type="checkbox" name="lb_id" value="<%=lb_id%>" onClick="highlightRow(this,'#FFFFCC','#EFF4FA');"></td>
<td class="btline difcursor" nowrap  width="7%">&nbsp;<%=rs.fields.item("lb_name")%></td>
<td class="btline"  nowrap  width="10%"><input type="text" name="working_day" id="working_day" value="<%=rs.fields.item("MaxOfdays")%>" size="7" onFocus="startCalc();" onBlur="stopCalc();"></td>
<td class="btline "  nowrap width="10%"><input type="text" name="wage" id="wage" value="<%=formatnumber(rs.fields.item("Total"),2)%>" onFocus="startCalc();" onBlur="stopCalc();"></td>
<td class="btline "  nowrap  width="8%"><input type="text" name="OT" id="OT" size="7" onFocus="startCalc();" onBlur="stopCalc();"><input type="hidden" id="OT_rate" value="<%=rs.fields.item("lbOT")%>" ></td>
<td class="btline " nowrap  width="8%"  ><input type="text" name="soc_sec" id="soc_sec" size="7" value="<%=soc_sec_v%>" onFocus="startCalc();" onBlur="stopCalc();"></td>
<td class="btline" nowrap style="padding-left: 10px" width="8%" ><input type="text" name="ex_pay" id="ex_pay" size="7" onFocus="startCalc();" onBlur="stopCalc();"></td>
<td class="btline bold" width="10%"><input type="text" name="net_wage" id="net_wage" size="7"  disabled></td>
<td class="btline"   ><input type="submit"></td>

</tr>

</form>
<%
        Rs.movenext
        n = n + 1       
    Loop
End if
Rs.close

set Rs=nothing
Call DBConnClose()
%>
</table>


<script>
function startCalc(){ 
  interval = setInterval("calc()",1);
}
function calc(){

  wage = document.myform2.wage.value;
  OT_rate = document.myform2.OT_rate.value;
  OT = document.myform2.OT.value; 
     OT_amt = OT_rate * OT;
  soc_sec = document.myform2.soc_sec.value; 
  ex_pay= document.myform2.ex_pay.value; 
  net_wage = (wage * 1) + (OT_amt * 1) - (soc_sec * 1) + (ex_pay * 1);

  document.myform2.net_wage.value = net_wage.toFixed(2);
}

function stopCalc(){
  clearInterval(interval);
}
</script>
4

1 回答 1

2

问题是,对于数据库表中的每条记录,您都在创建一个单独的表单,并且所有表单都具有相同的名称,因此 JavaScript 在执行时无法找到实际的表单。

假设您想保持这种行为(每条记录的一个表单),您首先必须通过添加一些计数器来为每个表单赋予唯一的名称,您已经拥有了:

<form name="myform2_<%=n%>" action="salary_action.asp" method="POST">

通过添加计数器n,您可以为每个表单创建唯一名称。

下一步是改变调用函数的方式,你需要告诉 JavaScript 函数是谁调用了它,这样它才能获取正确的形式。为此,请将调用更改为:

onFocus="startCalc(this);" onBlur="stopCalc(this);"

this是保留的 JavaScript 标识符,当以这种方式传递时,它将是被聚焦或模糊的实际元素。

最后一步是修改 JavaScript 本身——你现在需要多个间隔,每个表单一个,所以关联数组是最简单的解决方案,将表单名称作为键。代码如下所示:

var intervals = {};
function startCalc(sender){ 
  var key = sender.form.name;
  intervals[key] = setInterval(function() {
    calc(key);
  },1);
}
function calc(key){
  var oForm = document.forms[key];
  wage = oForm.wage.value;
  OT_rate = oForm.OT_rate.value;
  OT = oForm.OT.value; 
  OT_amt = OT_rate * OT;
  soc_sec = oForm.soc_sec.value; 
  ex_pay= oForm.ex_pay.value; 
  net_wage = (wage * 1) + (OT_amt * 1) - (soc_sec * 1) + (ex_pay * 1);

  oForm.net_wage.value = net_wage.toFixed(2);
}

function stopCalc(sender){
  var key = sender.form.name;
  clearInterval(intervals[key]);
}

如您所见,表单名称现在从“sender”元素中提取,然后用于获取实际表单,而不是不再存在的单个“myform2”,因为您有多个表单。

于 2012-09-23T11:44:45.203 回答