银行凭条练习,不停地输入数字,onPress处理速度跟不上,导致回车后输入的数据最后一位丢失,大家有没什么办法?

解决方案 »

  1.   

    前台js:<script language="javascript" type="text/javascript">
        function fkeyPress(ob) {
            //if (!ob.value.match(/^[\+\-]?\d*?\.?\d*?$/)) ob.value = ob.t_value; else ob.t_value = ob.value; if (ob.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?)?$/)) ob.o_value = ob.value;
        }
        function fkeyUp(ob) {
            //if (!ob.value.match(/^[\+\-]?\d*?\.?\d*?$/)) ob.value = ob.t_value; else ob.t_value = ob.value; if (ob.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?)?$/)) ob.o_value = ob.value;
                
            ob.ivalue = RemoveDH(fmoney2(ob.value,<%=ptsjModel.ptsj_xxw %>));
            if(parseFloat(ob.ivalue) == parseFloat(ob.svalue)) {
                ob.isright = "1";
            }
            else {
                ob.isright = "0";
            }        actSum2();
            totalLines();
        }
        function fonBlur(ob) {
            //if (!ob.value.match(/^(?:[\+\-]?\d+(?:\.\d+)?|\.\d*?)?$/)) ob.value = ob.o_value; else { if (ob.value.match(/^\.\d+$/)) ob.value = 0 + ob.value; if (ob.value.match(/^\.$/)) ob.value = 0; ob.o_value = ob.value };
                
            if($(ob).val().length>0){//进行格式化
                //1 先替换逗号
                var value = $(ob).val();
                //格式化
                $(ob).val(fmoney2(value,<%=ptsjModel.ptsj_xxw %>));
                value = $(ob).val();
                value = RemoveDH(value);
                //2 输入的值存在ivalue属性
                $(ob).attr("ivalue",value);
            }
        }
        function fonFocus(ob) {
            //如果有值,则全部选中进行修改
            if($(ob).val().length > 0){
                $(ob).setSelection(0,$(ob).val().length);
                return;
            }
        }
        //合计样例
        function actSum1() {
            var pSum = 0;        $("td[pp='test']").each(function (i) {
                var f = RemoveDH($(this).text());
                pSum += parseFloat(f);
            });
                
            $("#Sum1").text(fmoney(pSum,<%=ptsjModel.ptsj_xxw %>));
        }
        //合计录入例
        function actSum2() {
            var pSum2 = 0;        $("input[pp='tt']").each(function (i) {
                if ($(this).val() != "" && $(this).val() != "-") {
                    pSum2 += parseFloat(RemoveDH(fmoney2($(this).attr("ivalue"),<%=ptsjModel.ptsj_xxw %>)));
                }
            });
                
            $("#Sum2").text(fmoney(pSum2,<%=ptsjModel.ptsj_xxw %>));
        }
        //统计输入行数、正确行数、错误行数
        function totalLines()
        {
            var LineAll = 0;
            var LineRight = 0;
            var LineError = 0;        $("input[pp='tt']").each(function (i) {
                if ($(this).val() != "") {
                    LineAll++;                if($(this).attr("isright") == "1")
                        LineRight++;
                    else
                        LineError++;
                }
            });        $("#InLines").text(LineAll);
            $("#RightLines").text(LineRight);
            $("#ErrorLines").text(LineError);
        }
        var pt_timeset=<%=Syms %>;
        var pt_timeall=<%=ptsjModel.ptsj_sc*60 %>;
        var ptsfjj = 0;
        var pt_secondCount = pt_timeset+1;
        function test()
        {
            if(ptsfjj==1)
                return;
            pt_secondCount--;
            var minute = Math.floor(pt_secondCount / 60);
            var second = pt_secondCount - minute * 60;
            var hour = Math.floor(minute / 60);
            minute = minute - hour * 60;
            hour = ("00"+hour);
            hour = hour.substring(hour.toString().length - 2,hour.toString().length);
            minute = ("00"+minute);
            minute = minute.substring(minute.toString().length - 2,minute.toString().length);
            second = ("00"+second);
            second = second.substring(second.toString().length - 2,second.toString().length);
            var s = hour + ":"+minute+":"+second;
            $("#ptksys_sj").html(s);
            if(pt_secondCount <= 0){
                JiaoJuan();
                //alert('jiaojuan');
                ptsfjj = 1;
                return;
            }
        }    function startPt()
        {
            stopPt();
            $(document).everyTime('1s',test);
        }
        function stopPt(){
            $(document).stopTime();
        }    $(document).ready(function () {
            actSum1();
            actSum2();
            totalLines();
            try
            {
                $("input[pp='tt']")[0].focus();
                $("input[pp='tt']")[0].focus();
                //$("input[id='txtJE']:first").focus();
                //$("input[id='txtJE']").eq(0).focus();
            }
            catch(e)
            {
                alert(e.message);
            }        $("input[pp='tt']").keydown(function () {
                var key = event.keyCode;
                switch (key) {
    //                    case 37:    //left
    //                        {
    //                            if ($(this).parent().prev().length >= 1) {
    //                                $(this).parent().prev().find("input").focus();
    //                            }
    //                            break;
    //                        }
                    case 38:    //up
                        {
                            if ($(this).parent().parent().prevAll().length >= 2) {
                                var inputObj = $(this).parent().parent().prev().find("input").eq(0);                            $(inputObj).focus();
                                $(inputObj).setSelection(0,$(inputObj).val().length);
                            }
                            else {
                                $(this).setSelection(0,$(this).val().length);
                            }
                            break;
                        }
    //                    case 39:    //right
    //                        {
    //                            if ($(this).parent().next().length >= 1) {
    //                                $(this).parent().next().find("input").focus();
    //                            }
    //                            break;
    //                        }
                    case 13:
                        {
                            if ($(this).parent().parent().nextAll().length < 2) {
                                <% if(ta == th){ %>
                                    if(parseFloat($("#Sum2").text()) != 0) {
                                        JiaoJuan();
                                    }
                                <% } else { %>
                                    if(parseFloat($("#Sum2").text()) != 0) {
                                        showNext();
                                    }
                                <% } %>
                            }
                            else {
                                var inputObj = $(this).parent().parent().nextAll().find("input").eq(0);                            $(inputObj).focus();
                                $(inputObj).setSelection(0,$(inputObj).val().length);
                            }
                            break;
                        }
                    case 40:    //down
                        {
                            if ($(this).parent().parent().nextAll().length >= 2) {
                                var inputObj = $(this).parent().parent().nextAll().find("input").eq(0);                            $(inputObj).focus();
                                $(inputObj).setSelection(0,$(inputObj).val().length);
                            }
                            else {
                                $(this).setSelection(0,$(this).val().length);
                            }
                            break;
                        }
                    default:
                        {
                            break;
                        }
                }
            });        test();//开始计时
            startPt();//开始
        });
    </script>
    aspx前台:
    <asp:Repeater ID="Repeater1" runat="server">
        <ItemTemplate>
            <tr align="right" style="height:15px;">
            <td align="center"><%# DataBinder.Eval(Container.DataItem, "ptdtmx_xh")%></td>
            <td pp="test" style="padding-right:5px;font-size:12px;line-height:15px;" ondragstart="return false" oncontextmenu="return false"
                    onselectstart="return false" oncopy="return false">
                <%# string.Format("{0:N"+iXXW+"}", ((Double)(DataBinder.Eval(Container.DataItem, "ptdtmx_je"))))%>
            </td>
            <td align="right" style="padding-right:5px;">
                <input id="txtJE" name="txtJE" maxlength="15" pp="tt" type="text" t_value="" o_value="" 
                svalue="<%# DataBinder.Eval(Container.DataItem, "ptdtmx_je") %>" ivalue="<%# DataBinder.Eval(Container.DataItem, "ptdtmx_srje") %>" isright="<%# DataBinder.Eval(Container.DataItem, "ptdtmx_df") %>" te="" 
                style="width:150px; font-size:12px; padding-top:3px;border:0px none white;height:15px; line-height:15px; text-align:right; background-color:#CCE8CF;" 
                value='<%# ((double)(DataBinder.Eval(Container.DataItem, "ptdtmx_srje"))==0)?"":string.Format("{0:N"+iXXW+"}", ((Double)(DataBinder.Eval(Container.DataItem, "ptdtmx_srje"))))%>' 
                onKeyPress="fkeyPress(this);" onkeyup="fkeyUp(this);" onfocus="fonFocus(this);" onblur="fonBlur(this);"  />
            </td>
            </tr>
        </ItemTemplate>
    </asp:Repeater>
    以上是代码,高手帮我看看,逻辑就是,有一列数据25行,右边有一列输入框,照着左边的内容输入。
    最后一行进行实时统计列之和、输入的行数、输对的行数、输错的行数。输入框有以下几个属性:
    value:用户实时输入的值;
    svalue:源值,就是左边的数据(对照输入的数据,因为有格式化,所以对比起来比较复杂,用了这个属性);
    ivalue:输入的值;
    isright:本行是否输入正确;
    pp:是为Jquery选择用的,似乎也没啥用。
    上面这几个是我的业务逻辑用到的,
    t_value、o_value 这两个是网上找的只能输入数字验证用到的。函数解释:
    fmoney2:是将输入的内容格式化成金额格式。
    RemoveDH:把金额格式去掉逗号,还原成数字形式。
    test、startPT、stopPT这几个是计考试时间的。
    showNext、JiaoJuan这两个是保存本题跳至下一题,和交卷处理。
    输入验证逻辑主要在于这几个事件:
    fkeyPress、fkeyUp、fonBlur、fonFocus、keydown(function ()
    附带的几个功能事件:
    actSum1、actSum2、totalLines大家帮我看看这样写有没有可以改进的地方(有关js速度),但是用延时不太好,因为是考试计时间的。