1

最初のコード:

function searchItems(){
var noParameters = new Boolean(0);
var formFields = $('form')[0].elements;
for(i=0;1<formFields.length;i++){
    if(formFields[i].type == 'text'){
        if(!(formFields[i].value)){
            noParameters = 0;
        }
    }
}
alert(noParameters.valueOf());
}

この関数は、フォームの送信時に呼び出されます。目的は、タイプ'text'のすべてのフォームフィールドに値がないかどうかを確認することです(空の入力ボックス)。

必要だと思ったときにアラートが表示されません。ブール変数は宣言時に初期化されるため、値が含まれています。ifステートメントはすべて正常に機能するので、繰り返しチェックしました。ブラウザで発生する唯一のエラーは、フォームフィールドのタイプを「テキスト」と比較している行にある「タイプがnullであるか、オブジェクトではない」です。

アラートに対して別の構文を試しましたが成功しませんでした:noParameters.toString()、変数にnoParameters.valueOf()を割り当ててから、0と1の代わりに「true」と「false」をアラートします。アラートが表示されないのはなぜですか公演?

4

4 に答える 4

4

1 < formFields.length条件が常に真であるため、無限ループが発生します。それでも、非オブジェクトのプロパティにアクセスできないために評価されて例外が発生するiまで、毎回増加します。formFields[i]nulltype


あなたの質問に対して:new Boolean(0);値に対して絶対に不要なオブジェクトラッパーを作成しますfalse。使用しないでください。ループ内で、最終的に0変数に割り当てます。JavaScriptは弱い型であるため、構文的には有効ですが、それでも奇妙です。

次に、アラートで.valueOf()メソッドを使用します。数値の場合、0これは暗黙的にNumberインスタンスに変換されるため機能しますが、一般的ではありません。ブール値のみを使用した場合は、それは必要ありません。

于 2012-08-01T20:57:49.210 に答える
2

あなたはあなたのループで間違いを犯しました:あなたは「while」と言いました1

于 2012-08-01T20:56:33.430 に答える
2

あなたはおそらく意味しました

for(i=0;i<formFields.length;i++){
于 2012-08-01T20:58:55.467 に答える
1

他の人は、あなたがのように変数を持つべき場所に数字1のタイプミスがあることをすでに指摘しています。しかし、あなたの目的が次の場合:1<formFields.lengthii<formFields.length

「タイプ'text'のすべてのフォームフィールドに値がないかどうかを確認します(空の入力ボックス)。」

次に、次のように関数を少し整理します。

function searchItems(){
   var noParameters = true,
       formFields = $('form')[0].elements;
   for(i=0;i<formFields.length;i++){
      if(formFields[i].type == 'text' && formFields[i].value != ""){
         noParameters = false;
         break;
      }
   }
   alert(noParameters);
}

つまり、空白以外のテキストフィールドが検出されるとすぐに、noParametersfalseに設定され、ループから抜け出します。上記のコメントで述べたように、プリミティブ値trueを使用するだけでfalse、は使用しないでくださいnew Boolean()ifネストされたステートメントは必要ないことに注意してください。&&演算子は短絡評価を使用するため、左側の条件が真の場合にのみ右側の条件をテストします。

または、質問が「jquery」でタグ付けされているため、以下は短くなります(ただし、実行時の効率は低下します)。

function searchItems() {
   var noParameters = $('form input[type="text"]').filter(function(){
                         return this.value != "";
                      }).length === 0;

   alert(noParameters);
}

つまり、空白以外の値を持つテキストタイプの入力のセットの長さが0の場合、パラメータは設定されていません...

いずれにせよ、テストする時点で.value空白を削除して、ユーザーがスペースだけを入力してコードをだますことができないようにすることができます。

if(formFields[i].type == 'text' && formFields[i].value.replace(/\s/g,"") != "")
于 2012-08-01T21:25:14.883 に答える