【问题标题】:How do I get the previously focused element in JavaScript?如何在 JavaScript 中获取先前关注的元素?
【发布时间】:2011-11-11 20:23:47
【问题描述】:

我有一个带有多个文本输入的 HTML 表单。我想清除在按下“清除”按钮时立即具有焦点的元素。如何在 JavaScript 中获取该元素?

注意:重新措辞以将 cmets 考虑在内。

【问题讨论】:

  • 按下“清除”按钮时当前焦点元素将是“清除”按钮本身。好的,所以我有点傻,显然您想知道哪个字段刚刚失去焦点,但是如果用户使用 Tab 键导航到“清除”怎么办?
  • 你应该编辑这个问题的图块,因为没有一个答案真正回答“如何在 javascript 中获取当前焦点元素”,我通过搜索来到这里......
  • @BaptistePernet:查看祝福的答案...

标签: javascript html


【解决方案1】:

我不知道这是放置这个的好地方,还是其他人已经写了这个确切的解决方案。但这是我的看法。而且我只在 chrome 中测试过这个。

我发现 MDN (https://developer.mozilla.org/en-US/docs/Web/API/Element/focus_event) 上的“focusin”事件冒泡,然后跟踪到“focusout”并测试了这段代码,它对我有用

这样就可以工作,而不必选择所有元素并一次跟踪它们,也不必声明 2 个变量来跟踪前一个和当前

(function trackActiveElement () {

    document.lastActiveElement = undefined;

    document.addEventListener("focusout",function( focusEvent ) {
        var target = focusEvent.target;
        document.lastActiveElement = target
    })
    
}())

【讨论】:

  • 哇,好用! (火狐)。在这里自学让我看看我是否直截了当:自执行函数,给定名称 trackActiveElement(这有助于调试?)没有声明全局变量,但它基本上是附加到文档的 lastActiveElement。
【解决方案2】:

您可以在点击清除按钮时触发事件并将其保存在状态中,之后您可以查询状态并获取最后一个焦点并触发元素上的焦点。

为此,您可以使用辅助代码:

let lastFocus;
let currentFocus = document.activeElement;

function setCurrentFocusAsLastFocus() {
  currentFocus = document.activeElement;
  lastFocus = currentFocus;
}

function backToLastFocus() {
  lastFocus.focus();
  document.getElementById(lastFocus.id).focus();
}

【讨论】:

    【解决方案3】:

    根据 Tim Down 的答案构建我的答案,即使在触摸屏上也可以使用“pointerdown”事件。

    var toBeCleared;
    
    const btnClear = document.querySelector('#btn-clear'); // your clear button
    
    btnClear.addEventListener('pointerdown', function(event) {
      toBeCleared = document.activeElement;
    });
    
    btnClear.addEventListener('click', function(event) {
      toBeCleared.value = "";
    });
    
    

    【讨论】:

      【解决方案4】:
      var focused, inputs = document.getElementsByTagName('input');
      for (var i=0, input; i<inputs.length && (input = inputs[i]); i++) {
          if (input.type === 'text') {
              input.addEventListener('focus', function(){
                  focused = this;
              });
          }
      }
      

      或者在 jQuery 中: var focused; $('input:text').focus(function(){focused = this;});

      然后,当你想清除焦点元素时,focused.value='';

      【讨论】:

      • 哦,抱歉,我已经习惯了 99% 的 JavaScript 问题与 jquery 相关。我会更新答案,但我需要一些时间在手机上输入答案
      【解决方案5】:

      根据上面的想法,如果您正在使用表单,您可以定义一个隐藏输入并为其分配最后一个焦点输入的 id 值:

      <input type="hidden" id="focused_element" value="">
      
      $('input:text, textarea').focus(function() {
          $('#focused_element').val($(this).attr('id'));
      });
      

      然后在适当的时候取值:

      var focused = $('#focused_element').val();
      

      【讨论】:

        【解决方案6】:

        创建一个全局变量来存储当前焦点元素的id,

        var cur_id;
        

        为每个元素的onblur调用一个函数并传递id

        <input type="text" id="name" name="name" onBlur="setId(this.id)">
        

        并从该函数将 id 设置为全局变量

        function setId(id) {
            cur_id = id;
        }
        

        并为清除按钮的onclick编写一个函数,如下所示

        function clear() {
            document.getElementById(cur_id).value = "";
        }
        

        【讨论】:

        • 创建一个本地变量怎么样?太前卫了,我知道
        • @shesek - 这并不突兀,只是由于多个内联 onblur 很难维护。 (你的答案更好。)整个要求是突兀的,因为没有 JavaScript 是不可能的。
        • @shesek:它是有效的,不会造成伤害,并且在上下文中可能是适当的,所以我会说这是一个严厉的反对意见。
        • 我认为突兀的 JavaScript 是不合适的,应该不惜一切代价避免它。 JavaScript 代码不应该存在于 HTML 页面中,这是错误的。话虽这么说......我正在撤消反对票 - 因为它是一种常见的做法,也许它有点太苛刻了。 编辑 抱歉,3 小时后您显然无法撤消投票(除非答案已被编辑)
        • @shesek:我已经编辑了答案以获得更好的代码格式,因此您现在可以根据需要删除反对票。我确实同意,一般来说,不显眼的 JavaScript 是要走的路,但我仍然会为琐碎的演示或类似的演示使用事件处理程序属性,因为它比其他替代方案更简单、更快捷。 HTML5 仍然支持事件处理程序属性,因此它们不会很快消失。
        【解决方案7】:

        最简单的方法是在按钮上的mousedown 事件中存储对document.activeElement 的引用,尽管这是一种以鼠标为中心的方法,不适用于来自键盘和其他设备的按钮“点击”。

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

        代码:

        var clearButton = document.getElementById("clear");
        var previousActiveElement = null;
        
        clearButton.onmousedown = function() {
            previousActiveElement = document.activeElement;
        };
        
        clearButton.onclick = function() {
            if (previousActiveElement && previousActiveElement != this) {
                previousActiveElement.value = "";
            }
        };
        

        更好的方法是在按钮即将获得焦点时存储对document.activeElement 的引用。但是,要在所有浏览器中很好地实现这一点有点棘手。

        【讨论】:

        • 这里的关键好像是mousedown事件发生在blur之前,所以可以记录一下当时的活动元素。这是另一个关于事件顺序的 SO 问题:stackoverflow.com/questions/282245/…
        【解决方案8】:

        当您单击“清除”按钮时,只有聚焦的元素是“清除”按钮。你必须解决它。 (触发 onblur 事件)

        【讨论】:

        • 是的。那就是问题所在。我尝试使用 document.activeElement 但没有用。 :(
        • 哦,悖论太悲惨了……*呜咽*
        • 我讨厌focus 事件没有justblurred(或类似)属性的方式。它可能是null,它不是特定元素。
        • @genesis φ - onblur 没有达到我想要的效果:就像其他一些答案所说的那样,您仍然需要不厌其烦地保存模糊的元素,然后从您的 onfocus 处理程序中访问它(并且一些浏览器以奇怪的顺序触发这些事件,这无济于事)。我希望焦点事件本身可以告诉你刚刚模糊了什么,也许模糊事件应该告诉你刚刚聚焦了什么,这样你就不必编写自己的协调代码来实现它。
        【解决方案9】:

        正如 Genesis 所述,单击清除按钮时将获得焦点。但是,您可以通过为您的表单设置一个 onBlur 事件来解决此问题,该事件会将先前触摸的元素的 id 存储在变量或隐藏的表单输入中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-03
          • 2012-05-12
          • 1970-01-01
          • 2011-12-11
          • 1970-01-01
          • 2014-01-03
          • 1970-01-01
          • 2012-06-20
          相关资源
          最近更新 更多