JS速度跟不上怎么办? 银行凭条练习,不停地输入数字,onPress处理速度跟不上,导致回车后输入的数据最后一位丢失,大家有没什么办法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 前台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速度),但是用延时不太好,因为是考试计时间的。 用swfobject2.0在一个HTML页面中嵌入多个SWF文件怎么做。 如何修改拖动和关闭层的脚本为支持firefox和chrome document.write 使firefox 假死 这段代码能否用循环实现? 为什么这个程序在IE下会越用越慢? [JS算法]如何用JS实现链表和树的数据结构? 太欺负人了.兄弟们来帮我!!! 使用showModle方式弹出编辑界面,如何在关闭的时候判断数据是否被修改? createTextRange()如何利用? 怎么获取页面上面的全部div标签?? javascript一直很想明白的问题 Extjs和Weblogic是否有兼容问题?
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速度),但是用延时不太好,因为是考试计时间的。