我正在创建自己的组合框,以获得比<select>
标记更好的设计。
顺便说一句,我想知道,如何使用<span>
(或其他<p>
...)之间的键盘箭头键进行导航,并显示提案“标签”键。与<option>
代码的<select>
类似。
这是我想让它发挥作用的地方:
HTML
<input type="text" id="myInput" value=""/>
<div id="myDiv">
<span>Value 1</span>
<span>Value 2</span>
<span>Value 3</span>
</div>
CSS
#myDiv {display:none;border:1px solid #000;}
span {display:block;background:#EDEDED;cursor:pointer;}
span:hover {background:#555;color:#FFF;}
JS
$(document).ready(function(){
$('#myInput').focus(function(){
$('#myDiv').slideDown();
});
$('span').click(function(){
$('#myInput').val($(this).html());
$('#myDiv').slideUp();
});
});
您可以在此处进行测试:http://jsfiddle.net/eHpKX/2/
编辑示例:例如,在输入中单击或选项卡,然后使用箭头键导航...它不起作用。
任何帮助将不胜感激。
答案 0 :(得分:3)
我为uparrow
和downarrow
编写了一个keydown处理程序,就像选择下拉列表一样。但是tab
键在标记到下一个字段时具有特定的作用,所以我不想prevtDefault
浏览器行为。请参阅下面的代码,您可以从那里构建更多代码,
<强> CSS:强>
span.active {background:#555;color:#FFF;}
JS:
$(document).ready(function() {
$('#myInput').focus(function() {
if ($('#myDiv span.active').length == 0) {
$('#myDiv span:first').addClass('active');
}
$('#myDiv').slideDown();
}).focusout(function() {
$('#myDiv').slideUp();
});
$('span').click(function() {
$('#myInput').val($(this).html());
}).mouseenter(function() {
$('#myDiv span').removeClass('active');
}).keydown(function(e) {
alert(e.which);
});
//keydown event
$('#myInput').keydown(function(e) {
var $actvOpt = $('#myDiv span.active');
if (e.which == 13) { //enter key
if ($actvOpt.length != 0) {
$(this).val($actvOpt.text());
$('#myDiv').slideUp();
}
return;
}
var actvIndex = $actvOpt.removeClass('active').index();
var optCount = $('#myDiv span').length;
if (e.which == 40) { //keydown
actvIndex += 1;
} else if (e.which == 38) { //keydown
actvIndex -= 1;
}
if (actvIndex < 0) actvIndex = optCount - 1;
else if (actvIndex >= optCount) actvIndex = 0;
$('#myDiv span:eq(' + actvIndex + ')').addClass('active');
$actvOpt = $('#myDiv span.active');
$(this).val($actvOpt.text());
});
});