以编程方式将焦点设置在禁用按钮上不起作用

ele*_*y19 3 html jquery button

$(function () {
    $('#save').click(function() {
        $('#save').attr('disabled', 'disabled');
        console.log($(document.activeElement).attr('id'));
    });
    $('#test').focus();
    console.log($(document.activeElement).attr('id'));
});
Run Code Online (Sandbox Code Playgroud)
button:focus {
  outline: 1px dotted #000000;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>
<body id="body">
  <button id="discard" disabled="disabled">Discard</button>
  <button id="save">Save</button>
</body>
Run Code Online (Sandbox Code Playgroud)

我有一个Discard Changes按钮,单击时,用户会看到一个确认对话框,其中显示“您确定要放弃更改吗?”。当他们单击 时OK,我们关闭对话框并希望将焦点放回到Discard Changes按钮上,但我们现在已禁用它,因为没有要丢弃的更改。当我检查该document.activeElement值时,它不是禁用的按钮,而是主体元素。但是,当用户单击该Save按钮时,由于他们在物理上将焦点设置在该元素上,因此它会获得焦点,因此即使在禁用该按钮后,它仍然具有焦点。由于某种原因,在代码片段中,我没有看到在禁用的“保存”按钮上设置的焦点样式,即使在我的应用程序中我确实看到了它。

是否可以使用 jQuery 将焦点设置在禁用的按钮上?如果没有,为什么不呢?如果是这样,我做错了什么?

Cra*_*tic 5

不,该按钮无法接收焦点,因为它已被禁用。根据W3.org 规范(HTML5 版本),禁用的表单控件必须阻止单击事件和其他交互。

您需要做的是在某个时刻启用控件并以这种方式分配焦点。另一个建议是使按钮保持启用状态并实施某种形式的检测以确定是否响应丢弃按钮的click事件。

另外,(我在这里猜测)保存按钮可能显示为活动状态,因为它在被禁用之前就处于活动状态。尽管浏览器需要防止通过交互访问禁用的项目,但删除焦点(或document.activeElement在本例中)可能不是规范的实现要求。