0

このように生成した入力フィールドを持つフォームがあります

if (strpos($text, "[Objekt]") !== false) {
?>
<input type = "text" name = "objekt" value = "" /><br/>
<?php
}

今私はjavascriptでこれを検証しようとしていますが、jsがそこにないフィールドにヒットするとすぐに動作を停止しますこれをバイパスする解決策はありますか

これは私のjsです

            function isNumber(n) {
            return !isNaN(parseFloat(n)) && isFinite(n);
        }
        function validate() {
                if ((!isNumber(document.form1.test.value)) ||
                        (!isNumber(document.form1.bezahlt.value)) ||
                        (!isNumber(document.form1.differenz.value)) ||
                        (!isNumber(document.form1.saeumzuschlag.value)) ||
                        (!isNumber(document.form1.mahngebuehr.value)) ||
                        (!isNumber(document.form1.gesamtsumme.value))) {
                    alert("error");
                    return false;
                } else {
                    return true;
                }
        }
4

2 に答える 2

2

参照しようとしてdocument.form1.objekt存在しない場合は が表示undefinedされ、参照しようとするとundefined.valueエラーが発生します。フィールドが存在するかどうかは、次の方法でテストできます。

 if (document.form1.objekt) {
     // exists, so do something with document.form1.objekt.value
 }

未定義のテストを既存の検証コードにプラグインする方法はいくつかあります。

if (!(document.form1.objekt==undefined || isNumber(document.form1.objekt.value))) { ...

文脈では:

function validate() {
    if (!(document.form1.objekt==undefined || isNumber(document.form1.objekt.value)) ||
            (!isNumber(document.form1.test.value)) ||
            (!isNumber(document.form1.bezahlt.value)) ||
            (!isNumber(document.form1.differenz.value)) ||
            (!isNumber(document.form1.saeumzuschlag.value)) ||
            (!isNumber(document.form1.mahngebuehr.value)) ||
            (!isNumber(document.form1.gesamtsumme.value))) {
        alert("error");
        return false;
    } else {
        return true;
    }
}

明らかに、必要に応じて他のフィールドに同様のテストを適用できます。

または、その特定の検証が必要なすべての入力に a を追加してclass="numeric"から、JS でそのクラスのすべての入力を選択し、それらをisNumber()ループに渡すこともできます。その場合、どの特定のフィールドがページに含まれているかは問題ではありません。

更新:私の最後の提案を実装するには、すべての数値フィールドにあることを確認してから、次のclass="numeric"ようにします。

function validate() {
    var numFields = document.querySelectorAll("input.numeric");
    for (var i=0; i < numFields.length; i++) {
        if (!isNumber(numFields[i].value)){
            alert(numFields[i].name + " is invalid");
            return false;
        }
    }
    return true;
}

古いバージョンの IE (v8 より古い) をサポートする必要がある場合は.querySelectorAll()document.getElementsByTagName("input").

于 2013-08-05T11:15:58.900 に答える
2

次のような try-catch ステートメントを使用します。

try {
//your code
} catch(e) {
//if it gets here your code had a problem (the input does not exist)
}
于 2013-08-05T10:52:40.153 に答える