如何在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元素在这里很明显)。我并不抱怨投票关闭,我只是感到困惑。好吧,现在你知道我认为有人投票关闭的原因是什么了。我现在也这样做了,作为一个副本关闭,并链接到两篇文章,其中有很多关于如何检测和/或存储变量的解决方案。