基本上,我有一个下拉菜单,长得像这样:
<select>
<option>0</option>
<option selected="selected">1</option>
<option>2</option>
<option>3</option>
</select>
我正在尝试编写一个函数,即使选择相同的选项也会触发它,即使下拉菜单已经打开并重新选择了所选选项,我也希望它执行该函数。基本上,我有一个下拉菜单,长得像这样:
<select>
<option>0</option>
<option selected="selected">1</option>
<option>2</option>
<option>3</option>
</select>
我正在尝试编写一个函数,即使选择相同的选项也会触发它,即使下拉菜单已经打开并重新选择了所选选项,我也希望它执行该函数。如果你想用鼠标选择,你可以使用 mouseup
。但是,当选择框被打开时它也会触发,所以你需要跟踪它被触发的次数(偶数:选择框正在打开,奇数:选择框关闭):http://jsfiddle.net/T4yUm/2/。
$("select").mouseup(function() {
var open = $(this).data("isopen");
if(open) {
alert(1);
}
$(this).data("isopen", !open);
});
open
的状态就会出错;下次用户打开下拉列表时,就会触发事件。 - lumbricpimvdb的答案对我很有帮助,但我添加了一些额外的内容来处理键盘激活和移动选择时的导航:
$('select').mouseup(... as in pimvdb... )
.blur(function() {
$(this).data('isopen', false);
}).keyup(function(ev) {
if (ev.keyCode == 13)
alert(1);
});
select
并不是用于这种方式的 - 在大多数情况下,您可以使用一些技巧来获得此类行为,例如跟踪 select
上的鼠标和键盘事件,但不能保证它们将持续工作或在每个平台上都有效。
我建议要么...
select
重置为其默认值,并使用其他文本指示哪一个被“选中”,或者select
之外的控件。您能更详细地描述最终目标吗?
尝试以下解决方案。它考虑了通过鼠标单击或 Esc 键失去焦点的情况。
// whether or not dropdown is opened
var open = false;
$("#selectElement").on("click", function() {
open = !open;
if (!open)
{
console.log("option has been selected/re-selected");
}
});
// update dropdown state upon loss of focus
$("#selectElement").on("blur", function() {
if(open){
open = !open;
}
});
// update dropdown state upon Esc key of focus
$(document).keyup(function(e) {
if (e.keyCode == 27) {
if(open){
open = !open;
}
}
});
$("#select option").mouseup(function() {
$(this).parent().val($(this).attr("value"));
// do something.
});