1

我有一个案例,我在屏幕上有一堆文本框和单选按钮,所有这些都是用各种 DIV 动态构建的。所有文本框都有 onblur 例程来验证条目,但根据单选按钮的选择,文本框条目在最初有效时可能无效。我不能将 onblur 与单选按钮一起使用,因为它们可以从单选按钮进入无效的文本框之一并创建无限循环,因为我将焦点放在无效元素上。由于每个文本框都有自己的 onblur 调用特殊参数,我认为最好的方法是在提交表单时调用文本框的 onblur 事件,以确保所有条目在单选按钮配置下仍然有效已选择。如果其中一个 onblur 事件返回 false,我还需要它停止提交,以便他们可以更正错误的文本框。这是我写的...

    for (var intElement = 0; intElement < document.forms[0].elements.length; intElement = intElement + 1)
    {
        if (document.forms[0].elements[intElement].name.substr(3) == "FactorAmount") // The first 3 characters of the name are a unique identifier for each field
        {
            if (document.forms[0].elements[intElement].onblur())
            {
                return false;
                break;
            }
        }
    }

return true;

我最初有 (!document.forms[0].elements[intElement].onblur()) 但是当我有那个时,来自 onblur 事件的警报消息没有弹出。现在警报消息正在弹出,但如果遇到错误,它仍会继续循环遍历元素。我已经用调试器两种方式逐步完成了这个,它似乎循环得很好,但它要么是1)在我需要它时没有停止并返回false,要么2)没有执行我的警报消息来告诉用户什么错误是。有人可以帮忙吗?这可能是我正在做的愚蠢的事情。

被调用的 onblur 方法看起来像这样......

function f_VerifyRange(tagFactor, reaMin, reaMax, intPrecision, sLOB, sIL, sFactorCode)
{
    var tagCreditOrDebit;
    var tagIsTotal;
    var tagPercentageOrDecimal;

    eval("tagCreditOrDebit = document.forms[0]." + tagFactor.name.substr(0,3) + "CreditOrDebitC");

    eval("tagIsTotal = document.forms[0]." + tagFactor.name.substr(0,3) + "IsTotal");
    eval("tagPercentageOrDecimal = document.forms[0]." + tagFactor.name.substr(0,3) + "PercentageOrDecimal");

    if (tagPercentageOrDecimal.value == "P")
    {
        reaMax = Math.round((reaMax - 1) * 100);
        reaMin = Math.round((1 - reaMin) * 100);

        if (parseFloat(tagFactor.value) == 0)
        {
            alert("Please enter a value other than 0 or leave this field blank.");

            f_SetFocus(tagFactor);
            return false;
        }

        if (tagIsTotal.value == "True")
        {
            if (tagCreditOrDebit.checked)
            {
                if (parseFloat(tagFactor.value) > reaMin)
                {
                    alert("Please enter a value less than or equal to " + reaMin + "% for a credit or " + reaMax + "% for a debit.");
                    f_SetFocus(tagFactor);
                    return false;
                }
            }
            else
            {
                if (parseFloat(tagFactor.value) > reaMax)
                {
                    alert("Please enter a value less than or equal to " + reaMin + "% for a credit or " + reaMax + "% for a debit.");
                    f_SetFocus(tagFactor);
                    return false;
                }
            }
        }
    }

    return true;
}

编辑:我想我已经弄清楚为什么这不能按预期工作,但我仍然不知道如何完成我需要做的事情。下面的行...

            if (!document.forms[0].elements[intElement].onblur())

或者

            if (document.forms[0].elements[intElement].onblur())

没有返回单个 onblur 函数 (f_VerifyRange) 返回的内容。相反,无论如何它总是返回真或假。在第一种情况下,它返回 true,然后在第一个文本框之后退出并中止提交,即使第一个文本框没有错误。在第二种情况下,它返回 false 并遍历所有框。即使可能有错误(它显示),它也不认为有任何错误,所以它继续提交。我想我真正需要的是如何从我的 onblur 函数 f_VerifyRange 获取返回值。

4

4 回答 4

1

这个问题对我来说有点太深夜了,但我会给你一些建议:

eval("tagCreditOrDebit = document.forms[0]." + tagFactor.name.substr(0,3) + "CreditOrDebitC");

这可以用更好的方式编写:

tagCreditOrDebit = document.forms[0][tagFactor.name.substr(0,3) + "CreditOrDebitC"];

在 javascript 中,任何可以使用点分语法的地方,都可以使用方括号。

document.body;
document['body'];
var b = 'body';
document[b];

另外,考虑为您的表单提供某种标识符。我完全不知道为什么document.forms[0]这么长时间处理表单的标准方法是……如果您决定在该表单之前的页面上放置另一个表单,那么一切都会中断!

其他方法包括:

// HTML
<form name="myFormName">

// Javascript
var f = document.myFormName;

或者

<form id="myFormId">

var f = document.getElementById("myFormId")
于 2008-10-22T15:26:06.860 回答
0

你没有得到任何成功,if (!...onblur())因为直接使用时onblur()总是返回。是一个事件处理函数。就像您发现的那样,您必须创建一个解决方法。undefinedOnBlur()

于 2008-10-22T23:21:25.013 回答
0

我最终用一个全局变量解决了这个问题。g_bHardEditsPassed假设我们没有错误,我最初将值设置为 true。然后在 中f_VerifyRange,每次我返回一个值时,我都会在它前面放一行来设置g_bHardEditsPassed要匹配的变量。然后我修改循环看起来像这样......

    g_bHardEditsPassed = true;

    for (var intElement = 0; intElement < document.forms[0].elements.length; intElement = intElement + 1)
    {
        if (document.forms[0].elements[intElement].name.substr(3) == "FactorAmount")
        {
            document.forms[0].elements[intElement].onblur()
            if (!g_bHardEditsPassed)
            {
                g_bHardEditsPassed = true;
                return false;
            }
        }
    }

    return true;

感谢大家的建议。我确信 jQuery 的东西在未来特别值得研究。

于 2008-10-22T18:51:15.840 回答
-1

首先,看在上帝的爱和所有神圣的事物上,停止编写原生 javascript 并帮助自己使用一些jQuery :)

其次,开始使用验证框架。对于 jQuery,jQuery Validate通常工作得很好。它支持不同字段之间的依赖关系等。你还可以很容易地添加新规则,比如有效的 ISBN 号等。

编辑:至于你的代码,我不确定你是否可以使用 onunload ,因为那时没有回头路,你不能在那个时候中止。您应该将此代码放在 onsubmit 事件上。

于 2008-10-22T14:27:20.770 回答