1

I`mが動作していません。 addEventListener関数を使用すると、Selectタグからオプション "2"、 "10"、 "16"に対応するスイッチケースを呼び出すことができました。スイッチでは、JavaScriptとjQueryを使用してベースコンバータを構築するために、フォームからテキスト入力を検証しようとしている

問題は、それが唯一の選択タグとするとき、私は塩基から減少に最初の「変更」イベントのために働いているということです。例:ベース2を選択して10または16に変更した場合でも、16または10に変更しても0または1の文字しか受け入れられません。どうすれば修正できますか?

$(document).ready(function() { 
 

 
    var getFromBase = document.getElementById('frombase-select'); 
 

 
    getFromBase.addEventListener('change', function() { 
 

 
    switch(getFromBase.value) { 
 

 
     case '2': 
 
     $('#number').keypress(function(key) { 
 
     if((key.charCode < 48 || key.charCode > 49) && (key.charCode != 13)) { return false; } 
 
     }); 
 
     break; 
 

 
     case '10': 
 
     $('#number').keypress(function(key) { 
 
     if((key.charCode < 48 || key.charCode > 57) && (key.charCode != 13)) { return false; } 
 
     }); 
 
     break; 
 

 
     case '16': 
 
     $('#number').keypress(function(key) { 
 
     if((key.charCode < 48 || key.charCode > 57) && (key.charCode < 97 || key.charCode > 102) && (key.charCode < 65 || key.charCode > 70) && (key.charCode != 13)) { return false; } 
 
     }); 
 
     break; 
 

 
    } // End switch 
 

 
    }); // End addEventListener 
 

 
}); // End document.ready
.wrapper { 
 
    height: 90vh; 
 
    display: flex; 
 
    align-items: center; 
 
    justify-content: center; 
 
} 
 
form { 
 
    font-size: 20px; 
 
    width: 300px; 
 
    text-align: center; 
 
    border: 1px solid black; 
 
    padding: 20px; 
 
} 
 
form > * { 
 
    margin: 10px 0; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="wrapper"> 
 
    <form action="index.php" method="post"> 
 

 
    <div class="form-group flex-center"> 
 
     <label>From Base:</label> 
 
     <select id="frombase-select" name="frombase"> 
 
     <option selected disabled hidden>Enter a base</option> 
 
     <option>2</option> 
 
     <option>10</option> 
 
     <option>16</option> 
 
     </select> 
 
    </div> 
 

 
    <div class="form-group flex-center"> 
 
     <label>Number:</label> 
 
     <input type="text" id="number" name="number"> 
 
    </div> 
 

 
    </form> 
 
</div>

+1

あなたは – guest271314

+1

おかげ '#のfrombase-SELECT'要素のそれぞれ' change'イベントで '#のnumber'要素に追加' .keypress() 'イベントを装着しています。それは確かにコードをきれいにしました。相続人はあなたのrecomendationと更新は次のとおりです。 http://codepen.io/guizo/pen/ORByaQ – guizo

答えて

1

問題は、イベントハンドラを積み上げているということです。

は、ここに私のコードです。ハンドラをリセットすることはありません。したがって、最初に選択したベースの検証はバインドされません。これにより、最初に選択されたケースのコールバックだけがトリガされます。

あなたは、以前のハンドラを削除するoffを使用することができます。ドキュメントから:

説明:イベントハンドラを削除します。

.off(event)

イベント

種類:イベント

jQuery.Eventオブジェクト。

イベントハンドラを削除するためにイベント名を文字列として渡すことができます。

$("#number").off("keypress"); //Callback is optional 

Here's更新フィドル:イベントハンドラを削除するデモンストレーションoff

+0

@guizo - 私は非推奨メソッドを阻止するために行った編集内容を確認してください。 – Li357

+0

ありがとうございます。それが問題を解決しました。しかし、私はまだ、より大きな基盤からより小さな基盤への変更が、その出来事が束縛されていないにもかかわらず働いた理由を理解していません。 – guizo

+0

@guizoそうすべきではありません。最初の選択でイベントハンドラを設定し、それをリセットしないので、最初に選択したイベントハンドラ以外のイベントハンドラでは機能しません。 – Li357

関連する問題