【发布时间】:2026-01-24 02:10:01
【问题描述】:
考虑以下 HTML5+Javascript:
$(function() {
$('#edit').hide();
$('#value')
.css('cursor', 'pointer')
.click(function() {
$('#edit').show();
$('#edit input').focus();
$('#value').hide();
});
$('#edit input')
.keyup(function(e) {
if (e.keyCode == 13) { // <enter>
$('#value').show();
$('#edit').hide();
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="value">
<a href="#">hello</a>
</div>
<div id="edit">
<input type="text" value="hello" />
</div>
最初,所有这些都是为了捕获文本hello 上的点击事件,将文本替换为输入框。当用户然后点击 Enter 时,新文本将通过 AJAX 保存到服务器,并且输入框再次仅替换为文本。
现在我添加了a 标签以允许通过 Tab+Enter 而不是 only 使用鼠标导航(可访问性;耶!),但我发现,这样做时,对focus() 的调用会神奇地触发keyup() 事件。 (我知道这一点是因为注释掉对 focus() 的调用,否则会导致所需的行为。)
结果是在文本上切换和输入打开但随后立即关闭input 框,就用户而言,根本没有发生任何事情。
为什么input 的keyup 处理程序被一个完全不相关的元素上的click 事件触发?我怎样才能阻止这种情况发生?
工作场景
- 点击
hello -
hello消失;文本框出现,里面有插入符号 - 按 Enter
- 文本框消失;
hello再次出现
破碎的场景
- 关注文档
- 按 Tab 直到
hello成为焦点 - 按 Enter
-
hello消失;文本框出现,里面有插入符号 - 文本框消失;
hello再次出现......在我有机会做任何事情之前。
【问题讨论】:
-
在您损坏的场景中,在第 3 步中按住 enter。直到您释放它(即,在焦点输入上发生的按键操作),第 4 步和第 5 步才会发生。这就是它发生的原因,至于修复它...
-
@JamesThorpe:是的。 :(
-
在锚标签上放置一个 tabindex 并且输入可以解决任何问题吗?
-
内容可编辑的 DIV 不是适合您的解决方案吗? jsfiddle.net/7qjcdqzx
-
@LightningRacisinObrit 这是一个有趣的问题,所以请密切关注它——只是我自己没有时间尝试任何事情!
标签: javascript jquery html