Javascript:如何遍历元素并为某些元素调用onblur处理程序

时间:2008-10-22 14:15:05

标签: javascript javascript-events

我有一个案例,我在屏幕上有一堆文本框和单选按钮,都是用各种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并遍历所有框。即使可能存在错误(显示错误),但它并不认为存在任何错误,因此继续提交。我想我真正需要的是如何从f_VerifyRange获取返回值,这是我的onblur函数。

4 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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的东西尤其值得关注未来。

答案 2 :(得分:0)

if (!...onblur())没有取得任何成功,因为直接使用时onblur()的返回始终为undefinedOnBlur()Event Handler Function。就像你发现的那样,你必须创建一个解决方法。

答案 3 :(得分:-1)

首先,对于上帝的爱和所有圣洁的东西,停止编写原生javascript并帮助自己完成其中一些jQuery:)

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

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