keydown 在 Firefox 中不起作用
Posted
技术标签:
【中文标题】keydown 在 Firefox 中不起作用【英文标题】:keydown not working in firefox 【发布时间】:2012-02-27 16:37:46 【问题描述】: <script>
function MoveNext(e, obj)
if (!e) var e = window.event;
if (e.keyCode) code = e.keyCode;
else if (e.which) code = e.which;
if (code == 13)
document.getElementById(obj).focus();
return false;
</script>
上面的代码在 IE 中运行,但在 mozilla 中不运行,为什么
【问题讨论】:
您能否提供更多参与“工作”的代码。例如,如何调用它会影响它是否有效。 你希望它做什么?它实际上是做什么的?您收到错误消息吗?您是否能够缩小问题出在函数体中还是在调用方式上,例如,通过用单个alert("Test")
语句替换函数体?
【参考方案1】:
改变
if (e.keyCode) code = e.keyCode;
else if (e.which) code = e.which;
到
code = (e.keyCode)? e.keyCode: e.charCode;
并确保在调用它时将事件传递给 moveNext,因为只有当您从函数显式发送事件时,Firefox 才会识别事件。
此外,如果您正在执行 keydown 的对象是一个 div,则向其添加一个 0 的 tabindex,以便它可以检索焦点。
<div id="mydiv" tabindex="0"></div>
【讨论】:
甚至进一步简化为code = e.keyCode || e.charCode;
【参考方案2】:
返回键的最佳代码取决于您正在收听的键盘事件(keydown、keyup、keypress)。对于按键,您可以这样做:
function MoveNext(e, obj)
e = e || window.event;
var code = e.which || e.keyCode;
if (code == 13)
document.getElementById(obj).focus();
注意:我已删除您的局部变量 e
,因此它不会与参数 e
混淆,并且我已将 code
定义为局部变量,您将其作为隐式全局变量(从不一件好事)。
更多关于跨浏览器密钥处理的信息在这里描述:keycode and charcode。
【讨论】:
我理解一般意义上的提升,但是你确定包含var e
会覆盖参数e
吗?我没有在自己的代码中这样做,但我有一个想法,即尝试重新声明已在当前范围内定义的变量将被忽略,即额外的 var
将被忽略。
@nnnnnn - 是的,我非常确定。局部变量定义覆盖同名参数的方式与局部变量覆盖更高范围(包括全局变量)中任何同名变量的方式相同。请参阅此工作演示:jsfiddle.net/jfriend00/LSSK9。
感谢演示,但要澄清我想问的问题:如果你有一个函数参数 e
后跟 var e
(不分配新值)应该导致 @987654333 @ 具有值 undefined
由于您的答案中显示的可变提升行为?我试过这个:jsfiddle.net/LSSK9/1 在 IE 和 FF 中,参数没有改变,所以警报说“foo”。 if (!x) var x = 7;
也最终提醒“foo”。
@nnnnnn - 我明白你现在在问什么。这是一个更棘手的案例,我不确定。我不确定它在所有浏览器中是如何工作的。我当然建议不要那样做,因为编程的愿望充其量是模棱两可的。我已经编辑了我的答案。
是的,我当然不会推荐它或自己做——即使我确信它在所有浏览器中都有效,但它仍然会误导阅读。我确实使用了类似于问题中的 if 语句的代码,除了 without 有问题的var
,即if (!e) e = window.event;
以上是关于keydown 在 Firefox 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章