你的问题有一点错误:
问题是当在下拉列表中选择了不同的项目时,页面会由于“OnSelectedIndexChanged”事件而回发。
该页面实际上是因为AutoPostBack = "true"
.
首先将 AutoPostBack 更改为 False。
那么我建议您以不同的方式处理更改事件和按键事件。如果您使用 jQuery 处理更改事件,然后在该更改事件中提交,并且还处理 keydown 和过滤键,那么您只能在需要时提交。
$("#TargetSelect").change(function(event){
console.debug($(this).val());
});
$("#TargetSelect").keydown(function(event){
event.preventDefault();
if(event.which == 13){
$(this).trigger('change');
}else if(event.which == 38){
var idx = this.selectedIndex;
if(idx != 0){
$("#TargetSelect").prop('selectedIndex', idx-1);
}
}else if(event.which == 40){
var idx = this.selectedIndex;
var maxIndex = $('select').children('option').length;
idx += 1;
if(idx < maxIndex){
$("#TargetSelect").prop('selectedIndex', idx);
}
}else{
var $options = $('select').children('option');
$options.each(function(){
if(String.fromCharCode(event.which) == $(this).text().charAt(0)){
var idx = $(this).index();
$("#TargetSelect").prop('selectedIndex', idx);
}
});
}
});
这是一个(更新的)示例。用表单的提交替换 console.debug ,你应该是金色的。
如果您有多个选择框,则代码应如下所示:
$("select").change(function(event){
console.debug($(this).val());
});
$("select").keydown(function(event){
event.preventDefault();
if(event.which == 13){
$(this).trigger('change');
}else if(event.which == 38){
var idx = this.selectedIndex;
if(idx != 0){
$(this).prop('selectedIndex', idx-1);
}
}else if(event.which == 40){
var idx = this.selectedIndex;
var maxIndex = $(this).children('option').length;
idx += 1;
if(idx < maxIndex){
$(this).prop('selectedIndex', idx);
}
}else{
var $options = $(this).children('option');
var $thisSelect = $(this);
$options.each(function(){
if(String.fromCharCode(event.which) == $(this).text().charAt(0)){
var idx = $(this).index();
$thisSelect.prop('selectedIndex', idx);
}
});
}
});
另请注意,如果您有两个以键入的字母开头的条目,那么您将选择最后一个条目。可以对代码进行修改以允许过滤框。
多个盒子的例子