Javascript 仅在Firefox(JQuery)中文本字段的开始和结束处未触发按键事件

Javascript 仅在Firefox(JQuery)中文本字段的开始和结束处未触发按键事件,javascript,jquery,firefox,events,Javascript,Jquery,Firefox,Events,我正在收听授权输入字段上的按键事件。由于某些原因,Firefox不会在字段开始时触发游标向上的委托事件,或在字段结束时触发游标向下的委托事件。左和右始终按预期工作 直接将事件侦听器绑定到字段很好,因此它必须与委托有关。是否有人知道这是一个已知的问题,我在谷歌/论坛等上找不到任何东西 $("div").delegate(":input", "keypress", function(e){ // doesn't get triggered }); $("div :input").bind("k

我正在收听授权输入字段上的按键事件。由于某些原因,Firefox不会在字段开始时触发游标向上的委托事件,或在字段结束时触发游标向下的委托事件。左和右始终按预期工作

直接将事件侦听器绑定到字段很好,因此它必须与委托有关。是否有人知道这是一个已知的问题,我在谷歌/论坛等上找不到任何东西

$("div").delegate(":input", "keypress", function(e){
  // doesn't get triggered
});

$("div :input").bind("keypress", function(e){
  // gets triggered fine
});

这是一个演示,演示了这个问题-

这些键在Firefox中不会冒泡,至少在这种情况下不会冒泡,因此
.delegate()
.live()
将不起作用。这是一个已知的问题,在这种情况下最好使用不同的事件,如
keydown
keydup
,您可以查看有关此问题的快速简介:

请注意,keydown和keyup提供一个代码,指示按下了哪个键,而keypress指示输入了哪个字符。例如,通过keydown和keypup将小写字母“a”报告为65,但通过keypress将其报告为97。所有事件都将大写字母“A”报告为65。由于这种区别,在捕捉特殊的击键(如箭头键)时,.keydown()或.keyup()是更好的选择

将您的代码更新到以下位置:

$("div")().delegate(":input", "keyup", function(e){
  log("delegated: "+e.keyCode);
});

$("div :input").bind("keyup", function(e){
  log("bound: "+e.keyCode);
});

这些键在Firefox中不会冒泡,至少在这种情况下不会,因此
.delegate()
.live()
将无法工作。这是一个已知的问题,在这种情况下最好使用不同的事件,如
keydown
keydup
,您可以查看有关此问题的快速简介:

请注意,keydown和keyup提供一个代码,指示按下了哪个键,而keypress指示输入了哪个字符。例如,通过keydown和keypup将小写字母“a”报告为65,但通过keypress将其报告为97。所有事件都将大写字母“A”报告为65。由于这种区别,在捕捉特殊的击键(如箭头键)时,.keydown()或.keyup()是更好的选择

将您的代码更新到以下位置:

$("div")().delegate(":input", "keyup", function(e){
  log("delegated: "+e.keyCode);
});

$("div :input").bind("keyup", function(e){
  log("bound: "+e.keyCode);
});


他的事件处理程序肯定会被调用;我认为问题在于Firefox只在“keyup”和“keydown”事件循环中设置“keyCode”,而不是“keypress”。@Pointy-他的绑定事件正在被命中……根据冒泡,不是委托事件,实际上没有输入字符,因此没有冒泡。@Nick??当我尝试他的页面时,我从他的委托处理程序收到一条消息。@Pointy-我没有看到,你在使用firefox?是的,Windows上的firefox-我每个按键收到两条消息,一条说“委托”,另一条说“绑定”(但值始终为零)。你看不到它们是很奇怪的,我无法解释这一点;我认为问题在于Firefox只在“keyup”和“keydown”事件循环中设置“keyCode”,而不是“keypress”。@Pointy-他的绑定事件正在被命中……根据冒泡,不是委托事件,实际上没有输入字符,因此没有冒泡。@Nick??当我尝试他的页面时,我从他的委托处理程序收到一条消息。@Pointy-我没有看到,你在使用firefox?是的,Windows上的firefox-我每个按键收到两条消息,一条说“委托”,另一条说“绑定”(但值始终为零)。你看不到它们真是太奇怪了,我无法解释。设置这样的演示页面真是个好主意——我希望每个人都能看到!同意,演示+1!当调试代码转储掉“e.which”的值时会发生什么情况?这没有什么区别,因为函数从未被调用过。似乎Firefox在这种情况下不会冒泡(虽然在文本区域工作),设置这样的演示页面是一个非常好的主意-我希望每个人都这样做!同意,演示+1!当调试代码转储掉“e.which”的值时会发生什么情况?这没有什么区别,因为函数从未被调用过。在这种情况下,Firefox似乎不会冒泡(不过在文本区域也能正常工作)