1

画面上に多数のテキスト ボックスとラジオ ボタンがあり、すべてがさまざまな 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 から戻り値を取得する方法だと思います。

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

これをグローバル変数で解決することになりました。エラーが発生しないと仮定して、最初に値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 に答える
0

直接使用すると常に がif (!...onblur())返されるため、 で成功することはありません。イベントハンドラ関数です。あなたが発見したように、回避策を作成する必要があります。onblur()undefinedOnBlur()

于 2008-10-22T23:21:25.013 に答える
-1

まず、神への愛とすべての聖なるもののために、ネイティブの JavaScript を書くのをやめて、そのjQueryのいくつかに手を貸してください:)

次に、検証フレームワークの使用を開始します。jQuery の場合、jQuery Validateは通常非常にうまく機能します。異なるフィールド間の依存関係などをサポートします。また、有効な ISBN 番号などの新しいルールを非常に簡単に追加することもできます。

編集:あなたのコードに関しては、これに onunload を使用できるかどうかはわかりません。その時点では戻る方法がないため、その時点で中止することはできません。代わりに、このコードを onsubmit イベントに配置する必要があります。

于 2008-10-22T14:27:20.770 に答える