画面上に多数のテキスト ボックスとラジオ ボタンがあり、すべてがさまざまな DIV で動的に構築されている場合があります。すべてのテキスト ボックスのエントリを検証する onblur ルーチンがありますが、ラジオ ボタンの選択によっては、テキスト ボックスのエントリが元々有効であったときに無効になる場合があります。無効な要素にフォーカスを置いているため、ラジオ ボタンから無効にされたテキスト ボックスの 1 つに入り、無限ループを作成する可能性があるため、ラジオ ボタンで onblur を使用することはできません。各テキスト ボックスには onblur 呼び出し用の独自の特別なパラメーターがあるため、これを行う最善の方法は、フォームが送信されたときにテキスト ボックスの onblur イベントを呼び出して、ラジオ ボタンの構成ですべてのエントリがまだ有効であることを確認することだと思います。選択しました。また、onblur イベントの 1 つが 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 を返します。最初のケースでは、最初のテキスト ボックスにエラーがなかったにもかかわらず、true を返し、最初のテキスト ボックスの後で送信を終了して中止します。2 番目のケースでは、false を返し、すべてのボックスを通過します。エラーが発生した可能性がありますが (表示されます)、エラーはないと判断されるため、送信が続行されます。本当に必要なのは、onblur 関数である f_VerifyRange から戻り値を取得する方法だと思います。