这个问题与这个Autocomplete: first item 只有当用户在 tab key 上键入时才聚焦。
为了使第一个项目仅在用户使用 jqueryUi 键入 tab 键时聚焦,可以制作类似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 建议的一种选择是使用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();
});