この質問は、この1つのオートコンプリートに関連しています。最初の項目は、ユーザーがタブキーを入力したときにのみフォーカスされます。
ユーザーがjqueryUiを使用してタブキーを入力したときにのみ最初のアイテムに焦点を合わせるには、次のようなものを作成できますhttp://jsfiddle.net/uymYJ/8/(1)。
この実装の悪い点は、イベントオブジェクトの変更ですevent.keyCode = $.ui.keyCode.DOWN;
。
実際、このようにすることで、このイベントの他のすべてのリスナーに影響を与えます。後で実行されるkeydownイベントのすべてのリスナー(すべての委任されたリスナーを含む)は、event.keycodeを$.ui.keyCode.ENTERとして認識します。
私の質問は次のとおりです:
1)私の懸念はthe modification of the event object
正当化されていますか?そうでない場合はなぜですか?
2)同じ結果を達成するための別の方法を提案できますか?
3)@AaronDigullaによって提案されているように、1つのオプションはを使用することである可能性がありますdocument.createEvent()
。このコンテキストでこのメソッドを使用する適切な方法は何ですか?次のコード(3)を試しましたが、機能しません。
PS:
オートコンプリート(2)に関するコードは次のとおりです。
(1)
$("#box").keydown(function(e){
if( e.keyCode != $.ui.keyCode.TAB) return;
e.keyCode = $.ui.keyCode.DOWN;
$(this).trigger(e);
e.keyCode = $.ui.keyCode.ENTER;
$(this).trigger(e);
$(this).siblings("input").select();
});
(2)
function (e) {
var f = typeof e == "string",
g = Array.prototype.slice.call(arguments, 1),
h = this;
return e = !f && g.length ? a.extend.apply(null, [!0, e].concat(g)) : e, f && e.charAt(0) === "_" ? h : (f ? this.each(function () {
var d = a.data(this, c),
f = d && a.isFunction(d[e]) ? d[e].apply(d, g) : d;
if (f !== d && f !== b) return h = f, !1
}) : this.each(function () {
var b = a.data(this, c);
b ? b.option(e || {})._init() : a.data(this, c, new d(e, this))
}), h)
}
(3)
$("#box").keydown(function(){
e = document.createEvent('KeyboardEvent');
e.initEvent("keydown", true, true);
$(this).dispatchEvent(e);
if( e.keyCode != $.ui.keyCode.TAB) return;
e.keyCode = $.ui.keyCode.DOWN;
$(this).trigger(e);
e.keyCode = $.ui.keyCode.ENTER;
$(this).trigger(e);
$(this).siblings("input").select();
});