首页 新闻 会员 周边 捐助

js函数被交替循环调用,程序无法正常运行,怎么解决

0
悬赏园豆:50 [已解决问题] 解决于 2014-11-06 09:47
//脚本函数:
        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>
不老的石头的主页 不老的石头 | 初学一级 | 园豆:96
提问于:2014-11-04 18:10
< >
分享
最佳答案
1

 交替触发应该是其它函数的问题,你可以一个一个排除,看那个事件影响该问题

收获园豆:30
Yu | 专家六级 |园豆:12990 | 2014-11-05 08:57

我需要判断的数据有很多行,进行批量判断,但是每判断一个日期不符合格式,则该数据会select()获得焦点,当文本框控件A获得焦点,然后将鼠标移到文本框控件B上,这时A失去焦点,触发脚本函数:具体流程如下:

A失去焦点,同时,B获得焦点——>A触发函数,提示某行的数据不合法,提示某行的数据不合法,需要用户确认,A已经失去焦点,此时B还获得焦点——>点击确认信息——>B这时失去焦点,触发函数,A会因为select()函数获得焦点——>点击确认信息,则A又会失去焦点(问题来了,A,B交替触发函数,进入循环,让用户一直进行信息确认)

我的初步解决方案,是函数中的select()换成 将不合法的数据行 样式改变  进行描红突出,有更好的解决方案没

不老的石头 | 园豆:96 (初学一级) | 2014-11-05 14:31

@不老的石头: 去掉select()功能,不然就只有交替的执行

Yu | 园豆:12990 (专家六级) | 2014-11-05 15:15

@Yu: @幻天芒: 

我也想只能把select()函数给去掉,给文本控件 背景描红;在Js函数中添上: 

       $(obj).style("backgroundColor", "red");//一种
               $(obj).style.backgroundColor = "#FF0000";//第二种
            $(obj).BackColor = "#FF0000";//第三种

都不起作用,我有什么地方写得不对吗,我对js 真不是很了解,有什么见解,让文本控件内容或者背景变成红色?

不老的石头 | 园豆:96 (初学一级) | 2014-11-05 19:30

@不老的石头: $(obj).css({"background-color":"red"})

 

FYI

http://www.w3school.com.cn/jquery/css_css.asp

Yu | 园豆:12990 (专家六级) | 2014-11-05 20:23

@Yu: Ok,谢了:  $(obj).css({ "background-color": "white" })这个可以控制它的背景

不老的石头 | 园豆:96 (初学一级) | 2014-11-06 09:36
其他回答(2)
1

没有看出来js函数被交替循环调用呀,它们不是都只在失去焦点的时候才会触发事件吗?应该是没有问题的。

收获园豆:10
ThreeTree | 园豆:1490 (小虾三级) | 2014-11-04 20:47

我需要判断的数据有很多行,进行批量判断,但是每判断一个日期不符合格式,则该数据会select()获得焦点,当文本框控件A获得焦点,然后将鼠标移到文本框控件B上,这时A失去焦点,触发脚本函数:具体流程如下:

A失去焦点,同时,B获得焦点——>A触发函数,提示某行的数据不合法,提示某行的数据不合法,需要用户确认,A已经失去焦点,此时B还获得焦点——>点击确认信息——>B这时失去焦点,触发函数,A会因为select()函数获得焦点——>点击确认信息,则A又会失去焦点(问题来了,A,B交替触发函数,进入循环,让用户一直进行信息确认)

支持(0) 反对(0) 不老的石头 | 园豆:96 (初学一级) | 2014-11-05 14:29

@不老的石头: 失误,没想到这点。

支持(1) 反对(0) ThreeTree | 园豆:1490 (小虾三级) | 2014-11-06 01:04
1

F1、增加一个属性来标识,是否需要执行代码(这种最符合你的需求);

F2、改变验证模式,提交时验证;

收获园豆:10
幻天芒 | 园豆:37205 (高人七级) | 2014-11-05 08:54

我需要判断的数据有很多行,进行批量判断,但是每判断一个日期不符合格式,则该数据会select()获得焦点,当文本框控件A获得焦点,然后将鼠标移到文本框控件B上,这时A失去焦点,触发脚本函数:具体流程如下:

A失去焦点,同时,B获得焦点——>A触发函数,提示某行的数据不合法,提示某行的数据不合法,需要用户确认,A已经失去焦点,此时B还获得焦点——>点击确认信息——>B这时失去焦点,触发函数,A会因为select()函数获得焦点——>点击确认信息,则A又会失去焦点(问题来了,A,B交替触发函数,进入循环,让用户一直进行信息确认)

我的初步解决方案,是函数中的select()换成 将不合法的数据行 样式改变  进行描红突出

支持(0) 反对(0) 不老的石头 | 园豆:96 (初学一级) | 2014-11-05 14:30

@不老的石头: 可以只管自己,而不要去执行focus事件,这样就能避免交叉触发了。

支持(1) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2014-11-05 15:07

@幻天芒: 

我也想只能把select()函数给去掉,给文本控件 背景描红;在函数中添上: 

       $(obj).style("backgroundColor", "red");//一种
               $(obj).style.backgroundColor = "#FF0000";//第二种
            $(obj).BackColor = "#FF0000";//第三种

都不起作用,我有什么地方写得不对吗,我对js 真不是很了解,有什么见解,让文本控件内容或者背景变成红色?

支持(0) 反对(0) 不老的石头 | 园豆:96 (初学一级) | 2014-11-05 19:30

@不老的石头: 试一试这样行不行呢?obj.style.backgroundColor = "#FF0000";

支持(0) 反对(0) ThreeTree | 园豆:1490 (小虾三级) | 2014-11-06 01:03

@ThreeTree: 这个不知道为什么不起作用,Ok,去掉select(), 加上  $(obj).css({ "background-color": "white" })这个可以控制它的背景, 谢了,现在暂时解决了这个问题

支持(0) 反对(0) 不老的石头 | 园豆:96 (初学一级) | 2014-11-06 09:38

@不老的石头: 呵呵,需要注意jquey对象和dom对象的区别。

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2014-11-06 11:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册