のデフォルトのブラウザー動作をオーバーライドするコードを作成しました<select multiple="multiple">
。私の結論は、各ブラウザが入力と jQuery コードをどのように扱うかという理由で、これを試みるのは悪い考えだということです。
モーテンセン氏に、より予測可能な動作を提供するスクロール div 内のチェックボックスなどの UI ウィジェットまたは置換を見つけてから、その選択に私のコード機能を適用することをお勧めします。<select>
汎用コードにこだわったさまざまなオプションがあります。
矛盾点: Operaが思い通りに機能したことに驚きました。IE 7は私のコードを無視しました。Chrome : 表示されていない項目を選択するためにキーを押すと、上にスクロールしますが、下にはスクロールしません。不可解。Firefox : 作業できませんevent.preventDefault()
。したがって、私のコード全体は無視されます。
http://jsfiddle.net/rtLF2/
<html>
<head>
<style type="text/css">
</style>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function() {
var indices = {};
var count = 1;
// build a dictionary matching first letters to indices of where
// they were found
$("#mylist option").each(function() {
var letter = $(this).text().charAt(0).toLowerCase();
if(!indices[letter]) {
indices[letter] = [];
}
indices[letter].push(count);
count++;
});
var lastletter = "";
var lastindex = -1;
$("#mylist").on('keypress', function(event) {
event.preventDefault();
var pressed = String.fromCharCode(event.keyCode).toLowerCase();
if(pressed == lastletter) {
lastindex == indices[lastletter].length - 1 ? lastindex = 0 : lastindex++;
}
else {
lastletter = pressed;
lastindex = 0;
}
if(indices[lastletter]) {
var target = indices[lastletter][lastindex];
$("#mylist option:selected").each(function() {
$(this).removeAttr("selected");
});
$("#mylist option:nth-child(" + target + ")").attr("selected", "selected");
}
});
});
</script>
</head>
<body>
<select id="mylist" multiple="multiple" size="5">
<option value="1">Tank</option>
<option value="2">APC</option>
<option>Mini tricycle</option>
<option>Bike</option>
<option>Megatank</option>
<option>Brawler</option>
<option>Trailer</option>
<option>Md Tank</option>
<option>Armored van</option>
<option>War Machine</option>
</select>
</body>
</html>