繁体   English   中英

jQuery .change()事件不会从键盘上的选择列表中触发:如何覆盖它?

[英]jQuery .change() event doesn't fire on select list from keyboard: how can I override this?

jQuery .change()事件不会在用户第二次键入时触发,并按Enter键以选择项目。 它第一次开火。

请参阅: http//jsfiddle.net/CtXbU/

如果您专注于列表并键入AD并按Enter键,则[编辑]将触发警报。 但是,如果您输入AG并按Enter,则不会发生任何事情。 单击远离列表时,仅会弹出警报。

如果我想处理用户使用鼠标和键盘更改列表,我该怎么办?

我知道我可以使用.keypress()来处理键盘事件,但是让两个独立的代码段做同样的事情感觉很奇怪。

有没有一个jQuery事件可以在它们发生时立即处理鼠标和键盘的变化?

谢谢!

**更新**

这可能会澄清我的问题: http//jsfiddle.net/Bybr2/2/

// How can I create an event (or handler) that 
// (a) fires AS SOON AS keypress is invoked from user keyboard input
// (b) also fires AS SOON AS change is invoked from user mouse input
// (c) does not fire a second time when change is invoked after keypress, when the user clicks away following keypress?

按键后的change可能非常混乱 - 只有当用户按下Enter或点击时才会发生,所以如果我进行客户端更改,那么用户可能会非常惊讶!

我能想到的唯一解决方案是某种变量,如user_has_just_done_keypress ,在user_has_just_done_keypress上设置为true ,然后在下一次change事件时重置为false ,但感觉非常混乱。 它如果你有一个同样是行不通的change从鼠标的前change从用户并重订。 哎呀!

keyup事件添加处理程序,而不是按键! 如果你使用与keypress相同的处理程序和更改,它在Firefox中不能很好地工作。

$("select").bind('change keyup', select_handler);

和处理程序

function select_handler() {
    $(this).val();
};

更改功能将触发键盘输入:

  • 谷歌浏览器21.0.1180.89米
  • Internet Explorer 9.9.8112.16421

但不适用于Firefox 10.0.7(所有在Windows 7 Professional,SP1上)

添加:

$('select').keypress(function() {
  $(this).change();
});

到$(document).ready-function解决了,如果对我来说,没有打破其他浏览器。

更改事件仍将仅触发一次(尽管来自按键处理程序中的强制更改事件)。

您可以添加keypress并让两个函数调用另一个函数来执行您的实际操作。 这样复制就不那么糟了。 实际上,回车键在firefox中触发事件

这就是.change()适用于文本输入的方式。 您必须专注于更改才能生效。 这也记录在http://api.jquery.com/change/

change()Api文档读取

...当用户使用鼠标进行选择时,会立即触发事件,但对于其他元素类型,事件将延迟,直到元素失去焦点。

更新您可以将按键和更改组合在一个实时功能中,如下所示

$('div').live({
  'change': function() {},
  'keypress': function() {}
})

我在使用IE之前已经看过这个(所有版本,我认为)。 只有输入失去焦点时才会触发键盘更改事件; 绑定到多个事件是使处理程序像您期望的那样工作的唯一方法。 您可以通过将处理程序定义为全局函数来杀死一些冗余,然后将其设置为多个事件的处理程序:

function change_handler()
{
    // ...stuff...
}

$(document).ready(function() {
    $('input.whatever').bind('change keypress other_event ...', change_handler);
});

不像我想的那样干净,但它并没有那么糟糕,而且它有效。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM