ID #primarySearch
のフォームがあります。それは、3つのテキスト入力を持ち、そのすべてが以下のようなIDを持っています:#ecNumber
、#casNumber
、#substanceName
。jquery run条件付き検証内部.on
私は以下のjsを持っています。ユーザーが#primarySearch
にテキスト入力には何も入っている場合には、processPrimarySearch
という関数を実行し、それに対して適切な入力値を送信します。
$('#primarySearch input[type="text"]').on({
"keyup": function(e) {
// Ignore tab key
if (e.which != 9) {
processPrimarySearch.call(this);
}
}
});
function processPrimarySearch() {
// ...
}
私が停止する(ちょうどdocument.ready
の内部にある)他のいくつかのJSをも持っていますユーザーは数字とダッシュ以外のものを入力しますが、#ecNumber
フィールドと#casNumber
フィールドにのみ入力してください(これはjQuery only allow numbers,letters and hyphensから変更しました)。ユーザーがこれらの2つのフィールドに項目を入力している場合にこのコードが実行されますが、ユーザー入力が有効かどうかに関係なく、processPrimarySearch
が実行されます。上記のコード、および次のコードの間に接続がないので、これは次のとおりです。
$('#ecNumber, #casNumber').keypress(function (e) {
var allowedChars = new RegExp("^[0-9\-]+$");
var str = String.fromCharCode(!e.charCode ? e.which : e.charCode);
if (allowedChars.test(str)) {
return true;
}
e.preventDefault();
return false;
}).keyup(function() {
// the addition, which will check the value after a keyup (triggered by Ctrl+V)
// We take the same regex as for allowedChars, but we add^after the first bracket : it means "all character BUT these"
var forbiddenChars = new RegExp("[^0-9\-]", 'g');
if (forbiddenChars.test($(this).val())) {
$(this).val($(this).val().replace(forbiddenChars, ''));
}
});
現時点では何が起こっているかの結果は、文字が#ecNumber
に、このような「Z」と入力した場合ということです、検証正規表現コードは発射し、文字「z」が入力に表示されるのを止めます。しかしprocessPrimarySearch()
は、#primarySearch
フォームの入力に対して.on
の内部で定義されているため起動します。
私の問題: 私は私の.on
内の検証正規表現を実行しているが、それは#ecNumber
または#casNumber
分野だ場合にのみ(#substanceName
はここで検証されてはならない)やりたいです。
私は、入力を入力するフィールドを言うために配列を使用する以下のコードを書きました。私は
$('#primarySearch input[type="text"]').on({
"keyup": function(e) {
// Ignore tab key
if (e.which != 9) {
var arr = ["ecNumber", "casNumber"];
if ($.inArray($(this).attr('id'), arr)!== -1) {
console.log($(this).attr('id'));
}
processPrimarySearch.call(this);
}
}
});
これを行うための最善の方法は何ですかを発生することが検証正規表現を必要な場所はどこにconsole.logをされてやっていますか?私は関数に正規表現を行うコードを移動し、それを(.call
?)または他の方法で呼び出すかどうかわからないですか?そして、これが性質上非同期であるという問題はありますか?
'#ecNumber'と'#casNumber'は入力されていますか? '$( '#primarySearch')...)を追加する前に' $( '#ecNumber、#casNumber')。on(...) 'のように指定した場合はどうでしょうか?これにより、最初に実行される最初の関数が呼び出されます。 – BravoZulu
はい、3つのフィールド( '#ecNumber、#casNumber、#substanceName')はすべてテキスト入力です。私はポストを更新して、何が起こっているのかについて少し詳しい情報を与えました。問題は、私が投稿したコードの最初のビットと2番目のコードとの間には接続がないため、 'processPrimarySearch'は正規表現検証の結果に関係なく実行されます。 – Andy