<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script>!window.jQuery && document.write('<script src="jquery-1.4.3.min.js"><\/script>');</script> </HEAD> <BODY>
 <li>1.用户输入的值必须小于后面红色部分</li> 
  <li>2.如果CO要从20变成100,那么是从CO的下级或下级的下级里扣除,比如当CO变成100 则首先从SH扣除15 然后从SA1扣除10,SA2扣除15,SA3扣除20,SA4扣除20</li> 
  <li>3.如果CO从20变成0,那么CO的下级会从15变成35,就是说除了最后一级SA4,其余的如果上级增加就从下级扣除直到满足条件,如果上级减少则减少的部分会加给下级</li> 
   <li>4.如果把最后一级减少,那么减少的部分会添加到他的上一级,比如把SA4变成0那么SA4的上级SA3则是40</li>
   <li>5.如果把CO SH SA1 都设为0 那么SA2会变成60 这时需要提示出错 并且把CO SH SA1 SA2还原成初始化的状态</li>
     <br/><br/>
  <tr align="left" height="15" valign="middle">
              <th width="10%">
              <span style="color: red;">*</span>实际风险(%)</th>
              <td colspan="6" class="table01" bgcolor="#ffffff">
                   <div id="etd2">
                 CO<input size="5" onblur="check(0)" name="actualRiskVal" id="actualRiskVal0" oldvalue="20" value="20" type="text">
                 <span style="color: red;">/</span><span id="maxRisk0" style="color: red;">100</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                 SH<input size="5" onblur="check(1)" name="actualRiskVal" id="actualRiskVal1" oldvalue="15" value="15" type="text">
                 <span style="color: red;">/</span><span id="maxRisk1" style="color: red;">80</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                 SA1<input size="5" onblur="check(2)" name="actualRiskVal" id="actualRiskVal2" oldvalue="10" value="10" type="text">
                 <span style="color: red;">/</span><span id="maxRisk2" style="color: red;">65</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                 SA2<input size="5" onblur="check(3)" name="actualRiskVal" id="actualRiskVal3" oldvalue="15" value="15" type="text">
                 <span style="color: red;">/</span><span id="maxRisk3" style="color: red;">55</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                 SA3<input size="5" onblur="check(4)" name="actualRiskVal" id="actualRiskVal4" oldvalue="20" value="20" type="text">
                 <span style="color: red;">/</span><span id="maxRisk4" style="color: red;">40</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;<br>
                 SA4<input size="5" onblur="check(5)" name="actualRiskVal" id="actualRiskVal5" oldvalue="20" value="20" type="text">
                 <span style="color: red;">/</span><span id="maxRisk5" style="color: red;">20</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;</div>
                 <div id="etd"></div>              </td>
            </tr>
 </BODY>
 <script type="text/javascript">
     function check(id){
        var myData = data[id];
        myData.setValue(myData.getValue());
     }
     var data = [];
     for (var i = 0; i <= 5; i++) {
         data[i] = {
           id: i,
           field: $("#actualRiskVal" + i),
           limit: parseInt($("#maxRisk" + i).html()),
           getValue: function() {
             return this.field.val();
           },
           setValue: function(v) {
             var reg=/^[0-9]+$/;
             if(!reg.test(v)) {
               alert("请输入数字");
               this.field.val(this.oldValue);
               return;
             }
             if (v > this.limit) {
               alert("必须小于最大值"+this.limit);
               this.field.val(this.oldValue);
               return;
             }
             this.field.val(v);
             diff = v - this.oldValue;
             this.oldValue = v;
             if (this.next) {
               this.next.adjust(-diff);
             }
           },
           oldValue: $("#actualRiskVal" + i).val(),
           adjust: function(diff) {
             if (diff == 0) {
               return;
             }
             var myVal = parseInt(this.getValue()) + diff;
             if (myVal < 0 || myVal > this.limit) {
                myVal = Math.max(0, Math.min(myVal, this.limit));
             }
             var myDiff = myVal - parseInt(this.oldValue) - diff;
             this.field.val(myVal);
             this.oldValue = myVal;
             if (this.next) {
               this.next.adjust(-myDiff);
             }
           }
         };
         if (i > 0) {
           data[i - 1].next = data[i];
           data[i].prev = data[i - 1];
         }
     }
 </script>
</HTML>正好有点事情,可能有些check还没写全,你先看看。

解决方案 »

  1.   

    看看jquery的验证jquery.validate.js
    例子:
    $("#registerForm").validate({
         rules: {
         registerUserName: "required",
         registerPassword: "required",
         registerConfirmPassword: {
         required: true,
    equalTo: "#registerPassword" 
         },
         registerEmail: {
         required: true,
         email: true       
         }
         },
         messages: {
         registerUserName: "Please enter your user name",
         registerPassword: "Please enter your password",
         registerConfirmPassword: {
         required: "Please provide a password",
         equalTo: "Please enter the same password as above"        
         },
         registerEmail: "Please enter a valid email address",
         }
         });
      

  2.   

    总体来说确实比较容易的,只是太繁琐了.
    LZ既然是用JQuery,可以考虑下用jquery的表单
    验证框架- Jquery formValidator
      

  3.   

    5楼楼主写的算法很好, 但是不能符合第5条的条件, 我在上面做了一些补丁.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     <HEAD>
      <TITLE> New Document </TITLE>
     
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
    <script>!window.jQuery && document.write('<script src="jquery-1.4.3.min.js"><\/script>');</script> </HEAD> <BODY>
     <li>1.用户输入的值必须小于后面红色部分</li> 
      <li>2.如果CO要从20变成100,那么是从CO的下级或下级的下级里扣除,比如当CO变成100 则首先从SH扣除15 然后从SA1扣除10,SA2扣除15,SA3扣除20,SA4扣除20</li> 
      <li>3.如果CO从20变成0,那么CO的下级会从15变成35,就是说除了最后一级SA4,其余的如果上级增加就从下级扣除直到满足条件,如果上级减少则减少的部分会加给下级</li> 
       <li>4.如果把最后一级减少,那么减少的部分会添加到他的上一级,比如把SA4变成0那么SA4的上级SA3则是40</li>
       <li>5.如果把CO SH SA1 都设为0 那么SA2会变成60 这时需要提示出错 并且把CO SH SA1 SA2还原成初始化的状态</li>
         <br/><br/>
      <tr align="left" height="15" valign="middle">
                  <th width="10%">
                  <span style="color: red;">*</span>实际风险(%)</th>
                  <td colspan="6" class="table01" bgcolor="#ffffff">
                       <div id="etd2">
                     CO<input size="5" onblur="check(0)" name="actualRiskVal" id="actualRiskVal0" oldvalue="20" value="20" type="text">
                     <span style="color: red;">/</span><span id="maxRisk0" style="color: red;">100</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                     SH<input size="5" onblur="check(1)" name="actualRiskVal" id="actualRiskVal1" oldvalue="15" value="15" type="text">
                     <span style="color: red;">/</span><span id="maxRisk1" style="color: red;">80</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                     SA1<input size="5" onblur="check(2)" name="actualRiskVal" id="actualRiskVal2" oldvalue="10" value="10" type="text">
                     <span style="color: red;">/</span><span id="maxRisk2" style="color: red;">65</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                     SA2<input size="5" onblur="check(3)" name="actualRiskVal" id="actualRiskVal3" oldvalue="15" value="15" type="text">
                     <span style="color: red;">/</span><span id="maxRisk3" style="color: red;">55</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                     SA3<input size="5" onblur="check(4)" name="actualRiskVal" id="actualRiskVal4" oldvalue="20" value="20" type="text">
                     <span style="color: red;">/</span><span id="maxRisk4" style="color: red;">40</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;<br>
                     SA4<input size="5" onblur="check(5)" name="actualRiskVal" id="actualRiskVal5" oldvalue="20" value="20" type="text">
                     <span style="color: red;">/</span><span id="maxRisk5" style="color: red;">20</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;</div>
                     <div id="etd"></div>              </td>
                </tr>
     </BODY>
     <script type="text/javascript">
         function check(id){
            var myData = data[id];
            myData.setValue(myData.getValue());
         }
         var data = [];
         for (var i = 0; i <= 5; i++) {
             data[i] = {
               id: i,
               field: $("#actualRiskVal" + i),
               limit: parseInt($("#maxRisk" + i).html()),
               originalValue: $("#actualRiskVal" + i).attr("oldvalue"),  //添加了一个原始值, 用于还原成初始化的状态的时候使用
               oldValue: $("#actualRiskVal" + i).val(),//记录前一个值
               
               getValue: function() {
                 return this.field.val();
               },
               setValue: function(v) {
                 var reg=/^[0-9]+$/;
                 if(!reg.test(v)) {
                   alert("请输入数字");
                   this.field.val(this.oldValue);
                   return;
                 }
                 if (v > this.limit) {
                   alert("必须小于最大值"+this.limit);
                   this.field.val(this.oldValue);
                   return;
                 }
                 this.field.val(v);
                 diff = v - this.oldValue;
                 this.oldValue = v;
                 if (this.next) {
                   this.next.adjust(-diff);
                 }
               },
               adjust: function(diff) {
                 if (diff == 0) {
                   return;
                 }
                 var myVal = parseInt(this.getValue()) + diff;
                 if (myVal < 0) {
                    myVal = Math.max(0, Math.min(myVal, this.limit));
                 }
                 if (myVal > this.limit) { 
                     alert("出了问题!");
                     for (var i = 0; i <= 5; i++) {  //用于满足第5条的条件
                      data[i].field.val(data[i].originalValue);
                      data[i].oldValue = data[i].originalValue;
                     
                     }
                     return;
                 }
                 
                 var myDiff = myVal - parseInt(this.oldValue) - diff;
                 this.field.val(myVal);
                 this.oldValue = myVal;
                 if (this.next) {
                   this.next.adjust(-myDiff);
                 }
               }
             };
             if (i > 0) {
               data[i - 1].next = data[i];
               data[i].prev = data[i - 1];
             }
         }
     </script></HTML>
      

  4.   

    貌似
    if (myVal > this.limit) { 
      alert("出了问题!");
      for (var i = 0; i <= 5; i++) { //用于满足第5条的条件
    你的修改有问题。
    myVal只是一个temp,只要后续能够用,还是能让他链式反应下去的
      

  5.   

    once again coding, be patient please.
      

  6.   

    <li>4.如果把最后一级减少,那么减少的部分会添加到他的上一级,比如把SA4变成0那么SA4的上级SA3则是40</li>我有个问题,如果把SA3 由25变成15,这种情况下s4已经是20%最大值,减少的部分应该加到哪里?
      

  7.   

    坦克哥http://avatar.profile.csdn.net/5/D/F/2_shine333.jpg
      

  8.   

    还有,oldvalue是一个固定值,这样的话,onblur事件触发后,oldvalue不改变也是个问题。。 是不是有必要再加一个onfocus事件,用来取得改变之前的值
      

  9.   

    嗯 其实减少的时候也可以 只是感觉那样比较麻烦  要判断变化后的值 是否超过了最大值 
    SH  20  /100   SA1 30  /40    SA2 10  /20 SA3 10 /30  
    如果把SA1变成0 那么 SA2则是40  但是他的最大值是20  那么SA2 多出来的20 就继续加给SA3 如果加给SA3后依旧 超过了最大值 那么依次往下加
      

  10.   

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     <HEAD>
      <TITLE> New Document </TITLE>
     
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
    <script>!window.jQuery && document.write('<script src="jquery-1.4.3.min.js"><\/script>');</script> </HEAD> <BODY>
     <form id="myForm" action="">
     <li>1.用户输入的值必须小于后面红色部分</li> 
      <li>2.如果CO要从20变成100,那么是从CO的下级或下级的下级里扣除,比如当CO变成100 则首先从SH扣除15 然后从SA1扣除10,SA2扣除15,SA3扣除20,SA4扣除20</li> 
      <li>3.如果CO从20变成0,那么CO的下级会从15变成35,就是说除了最后一级SA4,其余的如果上级增加就从下级扣除直到满足条件,如果上级减少则减少的部分会加给下级</li> 
       <li>4.如果把最后一级减少,那么减少的部分会添加到他的上一级,比如把SA4变成0那么SA4的上级SA3则是40</li>
       <li>5.如果把CO SH SA1 都设为0 那么SA2会变成60 这时需要提示出错 并且把CO SH SA1 SA2还原成初始化的状态</li>
         <br/><br/>
      <tr align="left" height="15" valign="middle">
                  <th width="10%">
                  <span style="color: red;">*</span>实际风险(%)</th>
                  <td colspan="6" class="table01" bgcolor="#ffffff">
                       <div id="etd2">
                     CO<input size="5" onblur="check(0)" name="actualRiskVal" id="actualRiskVal0" oldvalue="20" value="20" type="text">
                     <span style="color: red;">/</span><span id="maxRisk0" style="color: red;">100</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                     SH<input size="5" onblur="check(1)" name="actualRiskVal" id="actualRiskVal1" oldvalue="15" value="15" type="text">
                     <span style="color: red;">/</span><span id="maxRisk1" style="color: red;">80</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                     SA1<input size="5" onblur="check(2)" name="actualRiskVal" id="actualRiskVal2" oldvalue="10" value="10" type="text">
                     <span style="color: red;">/</span><span id="maxRisk2" style="color: red;">65</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                     SA2<input size="5" onblur="check(3)" name="actualRiskVal" id="actualRiskVal3" oldvalue="15" value="15" type="text">
                     <span style="color: red;">/</span><span id="maxRisk3" style="color: red;">55</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;
                     SA3<input size="5" onblur="check(4)" name="actualRiskVal" id="actualRiskVal4" oldvalue="20" value="20" type="text">
                     <span style="color: red;">/</span><span id="maxRisk4" style="color: red;">40</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;<br>
                     SA4<input size="5" onblur="check(5)" name="actualRiskVal" id="actualRiskVal5" oldvalue="20" value="20" type="text">
                     <span style="color: red;">/</span><span id="maxRisk5" style="color: red;">20</span><span style="color: red;">%</span>&nbsp;&nbsp;&nbsp;&nbsp;</div>
                     <div id="etd"></div>              </td>
                </tr>
    </form>
     </BODY>
     <script type="text/javascript">
         function check(id){
            var myData = data[id];
            myData.setValue(myData.getValue());
         }
         var data = [];
    function resetData() {
         for (var i = 0; i <= 5; i++) {
             data[i] = {
               id: i,
               field: $("#actualRiskVal" + i),
               limit: parseInt($("#maxRisk" + i).html()),
               getValue: function() {
                 return this.field.val();
               },
               setValue: function(v) {
                 var reg=/^[0-9]+$/;
                 if(!reg.test(v)) {
                   alert("请输入数字");
                   this.field.val(this.oldValue);
                   return;
                 }
                 if (v > this.limit) {
                   alert("必须小于最大值"+this.limit);
                   this.field.val(this.oldValue);
                   return;
                 }
                 this.field.val(v);
                 diff = v - this.oldValue;
                 this.oldValue = v;
                 if (this.next) {
                   this.next.adjust(-diff);
                 } else {
                   this.prev.adjust(-diff, true);
                 }
               },
               oldValue: $("#actualRiskVal" + i).val(),
               adjust: function(diff, prev) {
                 if (diff == 0) {
                   return;
                 }
                 var myVal = parseInt(this.getValue()) + diff;
                 if (myVal < 0 || myVal > this.limit) {
                    myVal = Math.max(0, Math.min(myVal, this.limit));
                 }
                 var myDiff = myVal - parseInt(this.oldValue) - diff;
                 this.field.val(myVal);
                 this.oldValue = myVal;
                 if (prev && this.prev) {
                   this.prev.adjust(-myDiff, true);
                 } else if (!prev && this.next) {
                   this.next.adjust(-myDiff)
                 }
               }
             };
             if (i > 0) {
               data[i - 1].next = data[i];
               data[i].prev = data[i - 1];
             }
         }
    }
    resetData();
     </script>
    </HTML>如果减少也可以传递的话(也就是5不成立),早上的代码,4已经加上。
      

  11.   

    shine333很负责任的男银啊!感动ing~
      

  12.   

    忘记说了,我加了一个form,加了一个resetData函数如果你需要恢复页面初始值的话,可以调用form的reset()并执行这个函数就可以了
      

  13.   

    果然是大牛哇 羡慕 膜拜下用js 面相对象的那种做法 俺一直没那种思想  shine333 推荐下 怎么样才能写出你那样的 面相对象的js 吧  等你回复了 俺就结贴了
      

  14.   

    和Java的编程思想一样,平时写Java代码的时候,多看看JDK或者其他开源框架,看看里面的那些类互相之间是如何协调工作,各司其职的,就可以了