//脚本函数: function f_checkMassDate(obj, type) { var mass = $.trim($(obj).val()); if (mass) { if (mass.length != 8) { alert("日期输入非法,请检查重新输入!"); $(obj).select();//获得当前对象输入焦点--这里会出现交替循环调用 return false; } var m_date = mass.substring(0, 4) + "-" + mass.substring(4, 6) + "-" + mass.substring(6, 8); if (!IsDate(m_date)) { alert("日期输入非法,请检查重新输入!"); $(obj).select();//获得当前对象输入焦点 return false; } if (1 == type) { var mdate = new Date(m_date.replace("\-", "\/")); var vdate = new Date(); vdate.setMonth(vdate.getMonth() + 3); if (mdate < vdate) { alert("近效期三个月内产品,不能入库,请检查重新输入!"); $(obj).select(); return false; } vdate.setMonth(vdate.getMonth() + 3); if (mdate < vdate) { if (!confirm("近效期六个月内产品,是否入库!")) { $(obj).select(); return false; } } return true; } else if (2 == type) { var mandate = new Date(m_date.replace("\-", "\/")); if (mandate > new Date()) { alert("生产日期不能大于今日,请检查重新输入!"); $(obj).select(); return false; } return true; } } }
<%--页面--%>
<%--当鼠标对tbMassDate文本框进行js验证的时候,将鼠标移动到tbManufacturingDate文本框,都会触发
脚本函数f_checkMassDate(),此时会导致脚本函数被交替触发,一直调用函数进行检验,导致程序无法正常运行
--%>
<td align="center">
<asp:TextBox ID="tbMassDate" Text='<%#ConvertDate(Eval("MassDate"))%>' Width="95%" runat="server" onfocus="javascript:select()" onpropertychange="javascript:checkInputFloat(this);" onkeydown="javascript:nextTab();" TabIndex='<%#Container.ItemIndex * 10 + 4 %>' onblur="javascript:f_checkMassDate(this, 1);" CssClass="MassDate">
</asp:TextBox> </td>
<td align="center">
<asp:TextBox ID="tbManufacturingDate" Text='<%#ConvertDate(Eval("ManufacturingDate"))%>' Width="95%" runat="server" onfocus="javascript:select()" onpropertychange="javascript:checkInputInt(this);" onkeydown="javascript:nextTab();" TabIndex='<%#Container.ItemIndex * 10 + 5 %>' onblur="javascript:f_checkMassDate(this, 2);" CssClass="ManufacturingDate"></asp:TextBox>
</td>
交替触发应该是其它函数的问题,你可以一个一个排除,看那个事件影响该问题
我需要判断的数据有很多行,进行批量判断,但是每判断一个日期不符合格式,则该数据会select()获得焦点,当文本框控件A获得焦点,然后将鼠标移到文本框控件B上,这时A失去焦点,触发脚本函数:具体流程如下:
A失去焦点,同时,B获得焦点——>A触发函数,提示某行的数据不合法,提示某行的数据不合法,需要用户确认,A已经失去焦点,此时B还获得焦点——>点击确认信息——>B这时失去焦点,触发函数,A会因为select()函数获得焦点——>点击确认信息,则A又会失去焦点(问题来了,A,B交替触发函数,进入循环,让用户一直进行信息确认)
我的初步解决方案,是函数中的select()换成 将不合法的数据行 样式改变 进行描红突出,有更好的解决方案没
@不老的石头: 去掉select()功能,不然就只有交替的执行
@Yu: @幻天芒:
我也想只能把select()函数给去掉,给文本控件 背景描红;在Js函数中添上:
$(obj).style("backgroundColor", "red");//一种
$(obj).style.backgroundColor = "#FF0000";//第二种
$(obj).BackColor = "#FF0000";//第三种
都不起作用,我有什么地方写得不对吗,我对js 真不是很了解,有什么见解,让文本控件内容或者背景变成红色?
@不老的石头: $(obj).css({"background-color":"red"})
FYI
http://www.w3school.com.cn/jquery/css_css.asp
@Yu: Ok,谢了: $(obj).css({ "background-color": "white" })这个可以控制它的背景
没有看出来js函数被交替循环调用呀,它们不是都只在失去焦点的时候才会触发事件吗?应该是没有问题的。
我需要判断的数据有很多行,进行批量判断,但是每判断一个日期不符合格式,则该数据会select()获得焦点,当文本框控件A获得焦点,然后将鼠标移到文本框控件B上,这时A失去焦点,触发脚本函数:具体流程如下:
A失去焦点,同时,B获得焦点——>A触发函数,提示某行的数据不合法,提示某行的数据不合法,需要用户确认,A已经失去焦点,此时B还获得焦点——>点击确认信息——>B这时失去焦点,触发函数,A会因为select()函数获得焦点——>点击确认信息,则A又会失去焦点(问题来了,A,B交替触发函数,进入循环,让用户一直进行信息确认)
@不老的石头: 失误,没想到这点。
F1、增加一个属性来标识,是否需要执行代码(这种最符合你的需求);
F2、改变验证模式,提交时验证;
我需要判断的数据有很多行,进行批量判断,但是每判断一个日期不符合格式,则该数据会select()获得焦点,当文本框控件A获得焦点,然后将鼠标移到文本框控件B上,这时A失去焦点,触发脚本函数:具体流程如下:
A失去焦点,同时,B获得焦点——>A触发函数,提示某行的数据不合法,提示某行的数据不合法,需要用户确认,A已经失去焦点,此时B还获得焦点——>点击确认信息——>B这时失去焦点,触发函数,A会因为select()函数获得焦点——>点击确认信息,则A又会失去焦点(问题来了,A,B交替触发函数,进入循环,让用户一直进行信息确认)
我的初步解决方案,是函数中的select()换成 将不合法的数据行 样式改变 进行描红突出
@不老的石头: 可以只管自己,而不要去执行focus事件,这样就能避免交叉触发了。
@幻天芒:
我也想只能把select()函数给去掉,给文本控件 背景描红;在函数中添上:
$(obj).style("backgroundColor", "red");//一种
$(obj).style.backgroundColor = "#FF0000";//第二种
$(obj).BackColor = "#FF0000";//第三种
都不起作用,我有什么地方写得不对吗,我对js 真不是很了解,有什么见解,让文本控件内容或者背景变成红色?
@不老的石头: 试一试这样行不行呢?obj.style.backgroundColor = "#FF0000";
@ThreeTree: 这个不知道为什么不起作用,Ok,去掉select(), 加上 $(obj).css({ "background-color": "white" })这个可以控制它的背景, 谢了,现在暂时解决了这个问题
@不老的石头: 呵呵,需要注意jquey对象和dom对象的区别。