2017-06-29 3 views
0

ID #primarySearchのフォームがあります。それは、3つのテキスト入力を持ち、そのすべてが以下のようなIDを持っています:#ecNumber#casNumber#substanceNamejquery 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?)または他の方法で呼び出すかどうかわからないですか?そして、これが性質上非同期であるという問題はありますか?

+1

'#ecNumber'と'#casNumber'は入力されていますか? '$( '#primarySearch')...)を追加する前に' $( '#ecNumber、#casNumber')。on(...) 'のように指定した場合はどうでしょうか?これにより、最初に実行される最初の関数が呼び出されます。 – BravoZulu

+0

はい、3つのフィールド( '#ecNumber、#casNumber、#substanceName')はすべてテキスト入力です。私はポストを更新して、何が起こっているのかについて少し詳しい情報を与えました。問題は、私が投稿したコードの最初のビットと2番目のコードとの間には接続がないため、 'processPrimarySearch'は正規表現検証の結果に関係なく実行されます。 – Andy

答えて

1

プログラムの流れとその処理方法についてです。あなたの問題は、コードを提示した最後の方法では、実際には非同期の問題ではありません。ここに1つの解決策があります(可能なものの多く)。基本について説明するためにコードにいくつかコメントを入れました。

$('#primarySearch input[type="text"]').on({ 
    "keyup": function(e) { 
     // if this is not the tab key and the input contains valid characters 
     if (e.which != 9 && isThisValid($(this), e)) { 
      processPrimarySearch.call(this); 
     } 
     else { 
      e.preventDefault(); 
     } 
    } 
}); 


function isThisValid($elem, event) { 
    var ids = ["ecNumber", "casNumber"], // ids to validate, everything else is valid 
     result = true; // default result 

    // is this one of the id's to validate? 
    if(ids.indexOf($elem.attr('id')) !== -1) { 
     // do some validation 
     var allowedChars = new RegExp("^[0-9\-]+$"), 
      str = String.fromCharCode(!event.charCode ? event.which : event.charCode); 

     // is it valid? 
     if (!allowedChars.test(str)) { 
      result = false; 
     } 
    } 

    return result; 
} 

function processPrimarySearch() { 
    // ...  
} 
+0

「より汎用的」とは何を意味するのかよく分かりません。私が掲示したコードは、あなたが期待する通りに「順番に」実行されます。 'keyup'ハンドラで' if'ステートメントはプログラムの流れがそこから続く前に 'isThisVaild'関数が戻るのを待ちます。この回答が有用であることが判明した場合は、投票を頂きありがとうございます。 – gforce301

関連する問題