我有一个案例,我在屏幕上有一堆文本框和单选按钮,都是用各种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函数。
答案 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()
的返回始终为undefined
。 OnBlur()
是Event Handler Function。就像你发现的那样,你必须创建一个解决方法。
答案 3 :(得分:-1)
首先,对于上帝的爱和所有圣洁的东西,停止编写原生javascript并帮助自己完成其中一些jQuery:)
其次,开始使用验证框架。对于jQuery,jQuery Validate通常效果很好。它支持不同字段之间的依赖关系等等。您还可以非常轻松地添加新规则,如有效的ISBN号等。
编辑:至于你的代码,我不确定你是否可以使用onunload,因为那时无法回复,你不能在那时中止。您应该将此代码放在onsubmit事件上。