我正在使用 jQuery 处理 html 树上的 keydown 事件。正如您从代码中看到的,我正在处理 Tab 键,以便它在树中行走。但如果它到达树的末尾,我希望它从树中跳出并进入下一个可用字段。我尝试在这种情况下返回 true,但这不起作用。
这也会阻止其他键发挥作用。例如,我还想让 CTRL+R 起作用,但当我专注于树时它什么也不做。
我在调用 e.stopPropagation()
和 e.preventDefault()
之前返回,因此我希望默认浏览器能够拾取我的事件处理程序,但他们没有。我在其他帖子中读到,没有办法强制默认行为,所以我认为我最好的选择就是停止处理事件并传递它,但它没有被传递。有谁知道为什么吗?
$(treeItem).keydown(function(e) {
return onKeyDown(obj, e);
});
var onKeyDown = function(obj, e) {
if (!obj.isRoot) {
switch (e.keyCode) {
case keyCode.LEFT: collapseNode(obj); break;
case keyCode.RIGHT: expandNode(obj); break;
case keyCode.UP: stepUpTree(obj); break;
case keyCode.DOWN: stepDownTree(obj); break;
case keyCode.TAB: if (e.shiftKey) stepUpTree(obj); else stepDownTree(obj); break;
case keyCode.ENTER: me.activateNode(obj); break;
default: return true;
}
}
e.stopPropagation();
e.preventDefault();
}
编辑
我更新了代码以更准确地反射(reflect)正在发生的情况。现在更清楚问题是什么了。该事件附加到列表项元素,因此当我返回 true 时,它会继续在所有祖先上触发,直到到达根。此时,默认行为将停止。解决方案是仅在我知道需要时阻止默认行为,而不是使其成为默认行为。
最佳答案
您不必返回true
来告诉浏览器继续处理事件;如果您不执行 preventDefault
或 return false
,它就会执行此操作。只需在 default
子句中return
即可。 (我希望 return true;
是无害的,但是嘿,你永远不知道。)
您引用的代码中有几个错误。我假设您使用了复制和粘贴(为什么要重新输入它?),所以我想知道您遇到的问题是否只是抛出错误或逻辑不太正常你所期望的。
特别是
- 您在
onKeyDown
函数定义的参数部分中缺少obj
和e
之间的逗号,因此这是一个语法错误。 - 您将关闭
e.keycode
。它应该是e.keyCode
(注意大写的C
)。如果上面缺少的逗号实际上不在您的代码中,但e.keycode
将始终为undefined
并且与您的任何情况都不匹配,因此一切都会顺利为默认
。
关于javascript - 处理 keydown 事件中的某些键时遵循默认行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5755425/