如何在JavaScript中单击后保持焦点?

如何在JavaScript中单击后保持焦点?,javascript,Javascript,我使用代码将文本添加到textarea document.getElementById("b").addEventListener("click", function(e) { e.preventDefault(); var text='test',txtarea; // Problem var t = document.getElementsByTagName('textarea'); for(var i =0 ;i<t.length;i++){ if(

我使用代码将文本添加到
textarea

document.getElementById("b").addEventListener("click", 
function(e) {
  e.preventDefault();
  var text='test',txtarea;
  // Problem
  var t = document.getElementsByTagName('textarea');
    for(var i =0 ;i<t.length;i++){
    if(t[i]==document.activeElement) {txtarea=t[i]}
    }
  var scrollPos = txtarea.scrollTop;
  var strPos = 0;
  strPos = txtarea.selectionStart;
  var front = (txtarea.value).substring(0, strPos);
  var back = (txtarea.value).substring(strPos, txtarea.value.length);
  txtarea.value = front + text + back;
  strPos = strPos + text.length;
    txtarea.selectionStart = strPos;
    txtarea.selectionEnd = strPos;
    txtarea.focus();
  txtarea.scrollTop = scrollPos;
}
);
document.getElementById(“b”).addEventListener(“单击”,
职能(e){
e、 预防默认值();
var text='test',txtarea;
//问题
var t=document.getElementsByTagName('textarea');

对于(var i=0;i您说得对,当您单击按钮时,活动元素实际上是锚定标记。因此,要克服这一点,您需要保存在一个全局变量中,textarea是最后一个关注的变量,这样它就不会与
document.activeElement

将最后一个焦点元素保存到某个地方 解决方法是为每个textarea创建一个事件侦听器:

var previouslyFocused = null; //This should be in global scope

let textareas = document.querySelectorAll("textarea");
textareas.forEach(t=>{
    t.addEventListener("focus",(e)=>{
        window.previouslyFocused = e.target;
  })
})
现在,每个文本区域标记都有一个事件侦听器,当其中任何一个被聚焦时,它会用最后一个被聚焦的元素更新全局变量

当任何文本区域已被聚焦时,调节“添加文本” 处理“添加文本”锚定标记上的单击事件的函数有一些最小的修改,如您所见:

document.getElementById("b").addEventListener("click", function(e) {
  e.preventDefault();
  var text='test',
        activeTextArea,
        elements = document.querySelectorAll('textarea');

      if(window.previouslyFocused == null){
        activeTextArea = elements[0];
      }else{
        activeTextArea = window.previouslyFocused;
      }

  var strPos = activeTextArea.selectionStart,
      front = (activeTextArea.value).substring(0, strPos),
      back = (activeTextArea.value).substring(strPos, activeTextArea.value.length);
      activeTextArea.value = front + text + back;
      strPos = strPos + text.length;
      activeTextArea.selectionStart = strPos;
      activeTextArea.selectionEnd = strPos;
      activeTextArea.focus();
});
我只修改了变量并添加了一个条件if语句来检测任何文本区域何时还没有被聚焦,如果是,则将文本添加到第一个文本区域

当任何文本区域被聚焦时,你也可以将其更改为什么也不做。这取决于你

小提琴:

我建议您在每个
文本区域
上附加一个事件,当它们获得焦点时触发,并将对自身的引用存储在变量中。然后,单击,您只需从该变量中读取哪个事件并将焦点重置为它。我想知道这个问题怎么与编程无关,因为有人投票关闭了它?!我肯定他们这么做是因为您未在问题中提供可验证的样本(如您所想),但当外部资源消失时,这篇文章的价值也随之消失。因此,除了一个关于编程的问题外,还有其他原因,人们可以投票决定关闭、向上和向下,比如正确的格式等等。我相信你已经意识到了这一切。@LGSon我在这里提供了主代码,它可以支持外部链接(HTML元素在这里很明显)。我并不抱怨投票关闭,我只是感到困惑。好吧,现在你知道我认为有人投票关闭的原因是什么了。我现在也这样做了,作为一个副本关闭,并链接到两篇文章,其中有很多关于如何检测和/或存储变量的解决方案。