8

嗨,我已经设置了一个自动完成输入文本。我正在尝试通过单击 btn 和输入按键来触发重新打印表格的事件。btn click 工作正常,但 enter 按键似乎在停止之前触发了几次(意味着表格闪烁)

$('body').bind('keypress', function(e) {
        if(e.keyCode==13){
             var str = $('#Filter').val();
            $('#Table').fadeOut("slow").load('printShorts.server.php?Sortby=<?echo $sort;?>&dir=<?echo $direction;?>&filter='+encodeURIComponent(str)+'&usergroup=<?=$usergroup?>&no-cache=' + (new Date()).getTime() ).fadeIn("slow");
        }

}); 

它不会一直发生,并且在不同的浏览器中表现不同..

4

6 回答 6

14

结合 html 文本框的 keydown 事件不足以防止它被多次触发。您可以在 keydown 事件的 jquery 演示部分看到此行为:http: //api.jquery.com/keydown/

一种可能的解决方案是使用事件处理程序“one”(请参阅​​ http://api.jquery.com/one/)。这确保事件只被处理一次:

jQuery("#createNewProduct").one("keydown", function (e) {
    //Do Stuff
});
于 2012-11-12T14:10:50.450 回答
8

这是按键事件的正确行为。只要按键按下,按键事件就会一直触发(例如,如果您在文本区域中按住某个字符键,则会多次添加字符,这与按键有关)。对于一次性处理条件,根据您的要求使用 key-down 或 key-up 事件。key-up 和 key-down 都只触发一次。它是这样的:

{Key-Down} {Key-Press} {Key-Press} ..(as long as key is down).. {Key-Press} {Key-Up}
于 2012-06-13T12:12:59.250 回答
4

http://api.jquery.com/keypress/

当浏览器注册键盘输入时,keypress 事件被发送到元素。这类似于 keydown 事件,除了键重复的情况。如果用户按住某个键,则会触发一次 keydown 事件,但会为每个插入的字符触发单独的 keypress 事件。此外,修饰键(如 Shift)会触发 keydown 事件,但不会触发 keypress 事件。

改用 keydown 。

于 2012-06-13T12:11:20.757 回答
4

keypress 的文档说明:

由于 .keypress() 方法只是 .on( "keypress", handler ) 的简写,因此可以使用 .off( "keypress" ) 进行分离。

因此,您可以通过在绑定之前添加 .off() 来分离处理程序。我也会用 .on() 替换 .bind() 函数,因为 bind 现在已弃用。像这样的东西应该工作:

$('body').off().on('keypress', function(e) {
于 2015-05-19T09:27:39.947 回答
1

尝试将“keypress”更改为“keydown”。

当浏览器注册键盘输入时,keypress 事件被发送到元素。这类似于 keydown 事件,除了键重复的情况。如果用户按住某个键,则会触发一次 keydown 事件,但会为每个插入的字符触发单独的 keypress 事件。

来自http://api.jquery.com/keypress/

于 2012-06-13T12:13:23.237 回答
0

只需解绑并绑定即可。

$('body').unbind().bind('keypress', function(e) {
....
}
于 2020-03-26T07:59:13.580 回答