即使用户单击页面上的其他任何地方,如何使光标始终停留在文本区域上?

How to make cursor always stay on textarea even if user clicks anywhere else on the page?

我正在使用 Angular & Electron 开发聊天应用程序。

我希望用户的光标始终位于用户键入消息的文本区域。 当用户单击页面中的任何其他位置时,光标不应离开文本区域。这有助于用户随时随地输入,它只会在文本区域中输入。

我尝试了以下方法:

    setTimeout(() => {
      this.messageTextAreaInput.nativeElement.focus();
    }, 20);

我在 textarea 模糊事件中调用它。但是这个解决方案不允许我从其他消息中复制文本。当我 select 消息历史记录中的任何文本时,我的 selection 就会丢失。

还有其他方法可以实现吗?

我的应用供参考:

window.addEventListener("keydown", () => {document.getElementById("textarea").focus()});
<textarea id="textarea" ></textarea>

你可以尝试使用像

这样的东西
window.onclick = function(event) {
    if (!event.target.matches('.messageTextAreaInputClassName')) {
        document.getElementById('messageTextAreaInput').focus();
    }
}

这样点击文本区域以外的任何地方都会调用文本区域聚焦。

试试这个方法。您可以将焦点元素更改为您自己的可聚焦元素。

const focusOnTextInput = () => document.getElementById('input').focus();

document.addEventListener('click', focusOnTextInput);
document.addEventListener('DOMContentLoaded', focusOnTextInput);
<input type="text" id="input"/>

您可以检查按下的是哪个键,并可选择将按键附加到文本区域。但是,您基本上需要创建一个小型打字应用程序才能获得预期的行为。这是一个小例子,我用它来制作一个像文本区域一样的 semi-interactive 终端。默认情况下禁用文本区域,并根据需要附加按键并存储在名为 input 的变量中,您可以说这是正在键入的消息。

let altCtrl = false;
let input = '';
let txa = document.getElementById("textarea");
window.onkeyup = function(event){
    if(event.key == 'Alt' || event.key == 'Control'){
        altCtrl=false;
    }
    };
window.onkeydown = function(event){
    let keyPressed = event.key;
    const regex = /[^\p{L}]/;
    const allowed = /[0-9@#\s]/;
    const modifs = [/Shift/, /Alt/, /Backspace/, /Control/, /CapsLock/, /Tab/, /Escape/, /NumLock/, /Home/, /End/, /PageUp/, /PageDown/, /Enter/];
    const noPrintModifs = [/Alt/, /Control/];
    if(altCtrl == false){
        altCtrl = noPrintModifs.some(rx => rx.test(keyPressed));
    }
    let isMod = modifs.some(rx => rx.test(keyPressed));
    if((regex.test(keyPressed) || allowed.test(keyPressed)) && altCtrl == false && isMod == false){
        txa.append(keyPressed);
        input = input + keyPressed;
    }
    if(keyPressed == 'Backspace'){
        txa.readOnly=false;
        txa.innerHTML = txa.innerHTML.slice(0, -1);
        input = input.slice(0, -1);
        txa.readOnly=true;
    }
    if(keyPressed == 'Enter' && altCtrl){
        txa.append('\n');
    }
    if(keyPressed == 'Enter'){
        //do something with input text
        input = '';
    }
};

提示:您可能需要向 allowed 正则表达式添加更多符号。