ユーザーの柔軟な選択として、ブートストラップのタイプアヘッドを使用しようとしています。そのため、アイテムがわかっている場合はそれを選択し、そうでない場合はダイアログが開き、新しいアイテムを入力できます。
入力の変更イベントを監視することでこれを行っています。入力値がソース配列にない場合 (先行入力用)、「項目の追加」ダイアログがユーザーに表示されます。問題は、ユーザーがオプションの 1 つをクリックすると、先行入力が val を設定する前に変更イベントが送信されることです。これは、クリックするとテキストがぼやけるためです。
これを回避するためにアクティブな要素をチェックしたかったので、変更イベントで document.activeElement を見て、それが先行入力オプションの 1 つであるかどうかを確認しましたが、これは機能せず、body 要素全体が返されました。
コードの縮小版を次に示します。
HTML
<div id="contactModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 id="myModalLabel">Unknown Contact</h3>
</div>
<div class="modal-body">
<p>The contact you have entered is unknown. Press cancel to enter a different contact or fill out the details below to create a new contact</p>
<label>Name</label>
<input id="modal_contact" type="text" placeholder="dealership contact" value=""/>
<label>Email</label>
<input id="modal_contact_email" type="text" placeholder="dealership contact" value=""/>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
<button id="save" class="btn btn-primary">Save changes</button>
</div>
</div>
Javascript
var contacts = ['pete','geoff'];
$('.typeahead').typeahead({source:contacts, updater : function(item){
console.log('updater fired'); //fires after first change event
return item;
}});
$('input').change(function(ev){
console.log($(ev.target).val());
if ($.inArray($(ev.target).val(), contacts) < 0)
$('#contactModal').modal();
})
そして JSFiddle バージョンhttp://jsfiddle.net/k39vM/
ユーザーが先行入力をクリックして変更イベントが発生したかどうかをテストする方法を知っている人はいますか?