ユーザーが英国の郵便番号を入力し、テキストフィールドが選択リストに置き換えられるフォームを開発中です。これはすべて、ぼかしイベントを使用すると非常にうまく機能しますが、フィールドが変更されたことは必ずしも明らかではありません。
代わりにkeyupイベントを使用したいのですが、AJAXが引き続き発生するため、キーが押されるたびに少し遅延があります。フィールドにバインドされている既存の関数があります。
_$('#edit-postcode').bind('input', function(){
$(this).val(function(_, v){
return v.replace(/\s+/g, '').toUpperCase();
});
});
_
私はすでに単純な正規表現/(^[A-Z]{1,2}[0-9]{1,2})\s?([0-9][A-Z]{2}$)/i
を持っているので、それが広く正しい形式であることを確認します。検証を前の関数に追加し、文字列が検証に合格した場合、既存のAJAX機能をトリガーします。
N.B.デフォルトのDrupalオートコンプリート機能は、郵便番号に関連するIDを非表示にできないことを除けばほぼ完全に機能します。そのため、代わりにこのメソッドを使用しました。
実際には、カスタムjQueryイベントを使用することで、私がpostcodeValid
で呼び出した場合は、思ったよりもはるかに簡単です。
'#ajax' => [
'callback' => [$this, 'checkPostcode'],
'event' => 'postcodeValid',
'wrapper' => 'postcode-container',
],
私はすでにしなければならなかったJavaScript関数を変更しました:
$('#edit-postcode').bind('input', function() {
var trigger = $(this);
$(this).val(function(_, v) {
if (isValidPostcode(v)) {
trigger.triggerHandler('postcodeValid');
}
return v.replace(/\s+/g, '').toUpperCase();
});
});
isValidPostcode
関数は、郵便番号の正規表現に対する単純なテストです。おかげで 入力を許可するためにテキストフィールドでajax呼び出しを遅らせる これを発見することができました。