简单js计算:onchange时计算正确,onpropertychange时计算错误!
该程序的目的是实现:用obj输入框用来记录 tmp1,tmp2和(实际中我的tmp输入框会有很多个,所以,我用last来记录某一tmp输入框在修改前的值;并且想将结果(所有输入值的总和)在tmp的onpropertychange中显示到obj输入框)
function retsetMe(tmp) 用于处理用户的isNaN输入;
function recordlast(last, tmp) 记录tmp在修改前的值;
function calculate(obj, last, tmp) 计算,并将结果显示到obj输入库
现将程序重贴一遍:
<HTML>
<HEAD>
<script language="javascript">
function calculate(obj, last, tmp)
{
var oValue = obj.value;
var lValue = last.value;
var tValue = tmp.value;
if(tValue == ""){ tValue = 0; }
else
{ if(isNaN(tValue)) {tmp.value = 0; }
else
{ var ret = oValue - (lValue - tValue) ;
obj.value = ret;
}
}
}
function recordlast(last, tmp)
{
if(isNaN(tmp.value) || tmp.value=="") {last.value = 0;}
else
{
last.value = tmp.value;
}
tmp.select();
}
function retsetMe(tmp){
if(isNaN(tmp.value)){ tmp.value=0; }
}
</script>
</HEAD>
<body>
<form id="Form1">
obj:<INPUT id="obj" type="text" disabled name="obj" runat="server"> tmp:<INPUT id="last" disabled type="text"">
tmp1:<INPUT id="tmp1" onfocus="recordlast(last, this);" type="text" onchange="retsetMe(this);calculate(obj, last, this);"
value="0"> tmp2:<INPUT id="tmp2" onfocus="recordlast(last, this);" type="text" onchange="retsetMe(this);calculate(obj, last, this);"
value="0">
</form>
</body>
</HTML>
问题点数:100、回复次数:6Top
1 楼fangbuge(窗外的雨)回复于 2006-03-09 11:54:25 得分 25
那就在onchange里把总和计算出来,就不用那个onpropertychange了Top
2 楼smile9961(good life)回复于 2006-03-09 11:59:49 得分 0
问题是当用户更改了某个tmp后,直接点其它某个按钮提交页面,这时显示的总和就和实际各tmp的加总值不一致...Top
3 楼nameone(过客)回复于 2006-03-09 12:42:56 得分 25
UPTop
4 楼iuhxq(小灰)回复于 2006-03-09 12:59:08 得分 50
<script language="JavaScript">
<!--
function add()
{
document.getElementById('c').value = Number(document.getElementById('a').value) + Number(document.getElementById('b').value);
}
//-->
</script>
<input type="text" id="a" onchange="add();" onkeypress="add();" onkeyup="add();"><input type="text" id="b" onchange="add();" onkeypress="add();" onkeyup="add();"><input type="text" id="c">
Top
5 楼smile9961(good life)回复于 2006-03-09 13:29:09 得分 0
问题解决了,其实很简单,每次改变都重算一遍就行了;这样虽然笨点但很实用:
-----------------------------------------------------------
.aspx:
<script language=javascript>
function calculate(obj,tmp){
resetMe(tmp);
var ret=0;
var tmps=document.getElementById('Table1').getElementsByTagName("input");
for(var i=0; i<tmps.length; i++){ret = ret -(- tmps[i].value);}
obj.value=ret;
}
function resetMe(tmp){
if(isNaN(tmp.value)){tmp.value=0}
}
</script>
.vb
If Not IsPostBack Then
Dim script As String
script = "calculate(objs, this);"
tmp0.Attributes.Add("onpropertychange", script)
tmp1.Attributes.Add("onpropertychange", script)
...
script = "this.select();"
tmp0.Attributes.Add("onfocus", script)
tmp1.Attributes.Add("onfocus", script)
End If
Top
6 楼smile9961(good life)回复于 2006-03-09 13:39:13 得分 0
对了我的文本框还有长度的限制:
<INPUT type="text" id="tmp0" runat="server" value=0 maxlength=7>
<INPUT type="text" id="tmp1" runat="server" value=0 maxlength=7>
Top




