我有一个文本输入,当用户按下shift(keydown)并绑定一个监听器以使Shift键上升时,该输入目前是透明的
即
$('#foo').keydown(function(){
if(event.which==16){
//make #foo transparent
$(this).keyup(function(){
if(event.which==16){
//return #foo to its former glory
$(this).unbind('keyup');
}
});
};
})
当在按下和释放shift键之间没有按下任何字符时,这可以正常工作。问题是,当换档失败并且按下另一个角色时,换档键似乎已被完全遗忘。当释放shift键时,没有键盘触发。
我试图在.which
属性设置为16的情况下触发'假'keydown,在按下其他字符后向右移动,但无效。
任何建议都将不胜感激!
答案 0 :(得分:1)
在按 shift 的同时,它将持续触发keydown
个事件,直到您释放它为止,因此您的示例将绑定与keyup
一样多的keydown
个处理程序触发事件。这很可能会引发各种奇怪的问题。
相反,将keydown
和keyup
绑定到同一个处理程序并在那里做你的魔术:
$("#foo").on("keydown keyup", function (e) {
if (e.which === 16) {
if (e.type === "keydown") {
// make #foo transparent
} else {
// return #foo to its former glory
}
}
});
但是,如果在按 shift 然后释放时失去输入焦点,则无法按预期工作。解决此问题的一种方法是绑定到window
:
var $foo = $("#foo");
var shiftPressed = false;
$(window).on("keydown keyup", function (e) {
if (e.which === 16) {
shiftPressed = e.type === "keydown";
if (shiftPressed && e.target === $foo[0]) {
$foo.addClass("transparent");
} else {
$foo.removeClass("transparent");
}
}
});
$foo.on("focus blur", function (e) {
if (e.type === "focus" && shiftPressed) {
$foo.addClass("transparent");
} else {
$foo.removeClass("transparent");
}
});