【问题标题】:How to prevent an element from losing focus?如何防止元素失去焦点?
【发布时间】:2013-04-08 23:14:19
【问题描述】:

如何将焦点保持在一个文本框上?即使您在浏览器中单击任意位置。

$("#txtSearch").focus();

【问题讨论】:

  • 我猜很多咖啡不是一个可以接受的答案?你要强制用户按回车提交表单吗?
  • 不,他/她会触摸它,因为我正在使用平板电脑

标签: javascript jquery


【解决方案1】:

Konstantin Diev 回答在大多数情况下都可以,但如果您不想仅在单击 html 的某些部分时失去焦点,请执行以下操作:

$(".nofocus").on( "mousedown", function (e) {
    return false;
});

在我的情况下,我正在做一个小型 html 文本编辑器,我不想在按下操作按钮时失去控制,但在任何其他情况下都可以。

我只需要给按钮添加 nofocus 类,它不会控制

【讨论】:

  • 谢谢!这是理想的答案。该解决方案首先防止了焦点的丢失。如果您想操作 textarea 的 selectionStart,这就是您所需要的。所有其他答案都描述了如何在失去焦点后立即返回焦点。
  • 对我来说,这恰恰相反。它使我无法集中注意力...
  • 对我来说,我不得不打电话给e.preventDefault() 以防止失去焦点,return false 似乎什么也没做。 codepen.io/TechnoSam/pen/ZEyxxvy
【解决方案2】:

如果您只需要单击特定元素而不获取焦点,也可以不使用 jQuery 并且不重新聚焦

只需监听 mousedown 事件并取消它

element.addEventListener("mousedown", event => {event.preventDefault(); event.stopPropagation()});

【讨论】:

  • 正如几个答案所提到的,还有其他方法可以失去焦点,例如跳动。这可能对其他事情有用,但对原始问题没有用。
  • 你是对的,我找到解决方案后没有再阅读原始问题。我更新了我的答案
【解决方案3】:

除了单击远离输入的区域(即制表符)之外,还有其他失去焦点的方法。如果您想防止失去焦点,请使用模糊事件,即

document.getElementById('txtSearch').addEventListener('blur', e => {
  e.target.focus();
});

【讨论】:

    【解决方案4】:

    您需要订阅textboxblur 事件,并在小超时后恢复焦点:

    $('#txtSearch').blur(function (event) {
        setTimeout(function () { $("#txtSearch").focus(); }, 20);
    });
    

    这样您就不必依赖订阅页面上任何其他元素的事件。如果您订阅body clickhtml click,如果任何其他元素阻止其click 事件的传播,它将不会运行,并且在退出textbox 时它也不会工作。

    例子:

    <!-- I will not propagate my click to top level DOM elements -->
    <button id="button">Click me</button>
    
    <script>
    $('#button').click(function (event) {
        event.stopPropagation();
    });
    </script>
    

    【讨论】:

    • +1 这是目前为止唯一可以处理标签失焦等事件的答案。
    • Blur 是在元素失去焦点时触发的事件
    • @Curt 我解释了为什么不处理点击。
    • @LeonardChallis :如果你不超时,$("#txtSearch").focus() 将立即(同步)应用,然后blur 事件将在树中冒泡,文本区域将失去焦点.
    • 我总是这样解决这个问题 -> FIDDLE,发现它更“合适”???
    【解决方案5】:
    $('body').click(function(){$("#txtSearch").focus();});
    

    【讨论】:

      【解决方案6】:
      $("html").click(function(){
         $("#txtSearch").focus();
      });
      

      现场演示: http://jsfiddle.net/QhaLY/

      【讨论】:

      • 技术上如果你的速度很快,仍然可以输入#txtSearch2
      • @h2ooooooo: 或者如果你按'tab'
      • @h2ooooooo 我同意大卫的观点。我的回答阻止点击其他任何地方,但它不会阻止标签。康斯坦丁的答案是最好的解决方案。