3

私はJavascriptに比較的慣れていないので、これが単純な間違いであることを願っています. フォームの onSubmit で呼び出される一般的なフォーム検証関数を作成しています。この関数は、フォームのすべての子要素をループし、特定のクラスを探し、適切なフィールドの内容を分析します。欠落またはエラーが見つかった場合は、適切なエラー メッセージ div を表示して false を返し、フォームが php ページに送信されないようにします。

firefox 3.6.3 では問題なく動作しますが、私がテストした他のすべてのブラウザー (Safari 4.0.4、Chrome 4.1、IE8) では、onSubmit を無視して、php 処理ページに直接ジャンプするようです。

HTML コード:

    <form name='myForm' id='myForm' action='process_form.php' method='post' onSubmit="return validateRequired('myForm')">

   <fieldset class="required radioset">
    <label for='selection1'>
     <input type='radio' name='selection' id='selection1' value='1'/>
     Option 1
    </label>
    <label for='selection2'>
     <input type='radio' name='selection' id='selection2' value='2'/>
     Option 2
    </label>
    <label for='selection3'>
     <input type='radio' name='selection' id='selection3' value='3'/>
     Option 3
    </label>
    <label for='selection4'>
     <input type='radio' name='selection' id='selection4' value='4'/>
     Option 4
    </label>
    <div class='errorBox' style='visibility:hidden'>
     Please make a selection
    </div>
   </fieldset>

   <fieldset class="required checkset">
    <label>
     Choice 1
     <input type='checkbox' name='choices' id='choice1' value='1'/>
    </label>
    <label>
     Choice 2
     <input type='checkbox' name='choices' id='choice2' value='2'/>
    </label>
    <label>
     Choice 3
     <input type='checkbox' name='choices' id='choice3' value='3'/>
    </label>
    <label>
     Choice 4
     <input type='checkbox' name='choices' id='choice4' value='4'/>
    </label>
    <div class='errorBox' style='visibility:hidden'>
     Please choose at least one
    </div>
   </fieldset>


   <fieldset class="required textfield" >
    <label for='textinput1'>
     Required Text:
     <input type='text' name='textinput1' id='textinput1' size='40'/>
    </label>
    <div class='errorBox' style='visibility:hidden'>
     Please enter some text
    </div>
   </fieldset>

   <fieldset class="required email textfield">
    <label for='email'>
     Required Email:
     <input type='text' name='email' id='email' size='40'/>
    </label>
    <div class='errorBox' style='visibility:hidden'>
     The email address you have entered is invalid
    </div>
   </fieldset>


   <div>
    <input type='submit' value='submit'>
    <input type='reset' value='reset'>
   </div>

  </form>

ジャバスクリプトコード:

    function validateRequired(id){

 var form = document.getElementById(id);
 var errors = 0;
 var returnVal = true;
 for(i = 0; i < form.elements.length; i++){
  var elem = form.elements[i];
  if(hasClass(elem,"required")){

   /*RADIO BUTTON or CHECK BOX SET*/
   if(hasClass(elem,"radioset") || hasClass(elem,"checkset")){
    var inputs = elem.getElementsByTagName("input");
    var check = false;
    for(j = 0; j < inputs.length; j++){
     if(inputs[j].checked){
      check = true;
     }
    }
    if(check == false){
     errors += 1;
     showError(elem);
    } else {
     hideError(elem);
    }
   }

   /*TEXT FIELD*/
   else if(hasClass(elem,"textfield")){
    var input = elem.getElementsByTagName("input");
    if(input[0].value == ""){
     errors += 1;
     showError(elem);
    } else {
     hideError(elem);

     /*EMAIL ADDRESS*/
     if(hasClass(elem,"email")){
      if(isValidEmail(input[0].value) == false){
       errors += 1;
       showError(elem);
      } else {
       hideError(elem);
      }
     }
    }
   }
  }
 }
 if(errors > 0){
  returnVal = false;
 } else {
  returnVal = true;
 }
 return returnVal;}

これは見なければならないコードがたくさんあることは知っていますが、助けていただければ幸いです。1 つのブラウザーで正常に動作するため、デバッグを開始する方法がわかりません。ありがとうアンドリュー

4

6 に答える 6

1

hasClass は使用しません。より効果的な別の方法を次に示します。

var node_list = document.getElementsByTagName('input');
for (var i = 0; i < node_list.length; i++) {
    var node = node_list[i];

    if (node.getAttribute('type') == 'text') {
        // do something here with a <input type="text" .../>
        alert(node.value);
    }
} 

IE では、複数のクラスが関連付けられている一部の要素からクラスを取得する際に問題があることを知っています。とにかく便利な機能です。

于 2010-05-28T18:33:29.430 に答える
1
for(i = 0; i < form.elements.length; i++){
    var elem = form.elements[i];
    if(hasClass(elem,"required")){

問題は、あなたrequiredと他のクラスが<fieldset>要素に置かれることです。

Fieldset 要素は、form.elementsIE、Firefox、Opera のコレクションに含まれていますが、WebKit ブラウザー (Chrome、Safari) には含まれていません。あなたのフォームが失敗するのはこれらのブラウザーです。

コレクション<fieldset>に含まれていたのは、常に奇妙な癖でした。DOM レベル 2 HTMLelements仕様では、「フォーム コントロール要素」のみがコレクションに存在する必要があり、HTML4 の定義により、コントロール名または値を持たないフィールドセットが含まれないように見えると規定されています。

getElementsByTagName代わりに、フィールドセットを取得するために使用するようにコードを変更できます。

var fieldsets= form.getElementsByTagName('fieldset');
for (var i= 0; i<fieldsets.length; i++) {
    var elem= fieldsets[i];
于 2010-05-28T18:25:03.093 に答える
0

あなたの問題の原因ではないと確信していますが、ラジオボタンのセットを選択せず​​に一連のラジオボタンを提供しないことをお勧めします。

特定のケースでは、ページを提供するときに設定したことがわかっている場合は、「必須」チェックは必要ありません。ユーザーがラジオ ボタンを何も選択されていない状態にする方法はありません。賢明なデフォルトを選択し、それを最初のオプションにして、選択します。あなたの人生を簡素化:)

W3C から:

http://www.w3.org/TR/html401/interact/forms.html#radio

同じコントロール名を共有するセット内のラジオ ボタンが最初に「オン」でない場合、最初に「オン」にするコントロールを選択するためのユーザー エージェントの動作は未定義です。ノート。既存の実装ではこのケースの扱いが異なるため、現在の仕様は RFC 1866 ([RFC1866] セクション 8.1.2.4) とは異なります。

At all times, exactly one of the radio 
buttons in a set is checked. If
none of the <INPUT> elements of a set
of radio buttons specifies `CHECKED',
then the user agent must check the
first radio button of the set
initially.

ユーザー エージェントの動作は異なるため、作成者はラジオ ボタンの各セットで最初に「オン」になっていることを確認する必要があります。

于 2010-05-28T18:36:37.210 に答える
0

何らかの JavaScript エラーがある場合、関数は false を返さないため、データを送信するデフォルトの動作がトリガーされます。

最初に [ http://www.javascriptlint.com/online_lint.php][1]を介してコードを実行し、次にデバッガーを実行してみてください。

于 2010-05-28T18:11:27.883 に答える
0

if(errors > 0)... を使用しないようにしてください...すべての条件で(間違った入力の場合) put return false; 最後に、最後のブラケット put の前に true を返します。そしてより良い使用:

onSubmit="return validateRequired(this)"

この行には必要ありません(エラー変数を削除する場合)

 var form = document.getElementById(id);
 var errors = 0;
 var returnVal = true;
于 2010-05-28T18:12:08.710 に答える
0

ちょっと基本に戻りましょう。あなたは「onsubmit を無視しているようだ」と言います。それは私が考えることができる3つの可能性を残します:

  1. 関数が呼び出されることはありません
  2. 呼び出されて、途中でエラーで爆破中
  3. 呼び出され、思ったように動作せず、常に true を返します

あなたの質問からは明確ではないので、もし私があなただったら、IEがそれを呼び出しているかどうかを確認するために関数の先頭にアラートを置いてデバッグを開始し、そのアラートを下に移動して検証を再度実行します、表示されなくなった場所を確認します (エラーはそのポイントより上にある必要があります)。

また、呼び出された場所からの戻り値を警告して、何が返されているかを確認したいと思います。常に true の場合、コードは機能していますが、思ったとおりに動作していません。

そこから、精査するコードの正確なブロックではないにしても、少なくとも何が起こっているかをより明確に把握できます。

于 2010-05-28T19:14:39.660 に答える