Определить последнее написанное слово при вводе TAB в текстовой области или contenteditable div - PullRequest
0 голосов
/ 11 июня 2018

Как обнаружить и выбрать последнее написанное слово, когда TAB нажата в textarea или contenteditable div?

Я начал это делатьс буфером последних написанных символов или нажатий клавиш, но потом я заметил, что есть несколько угловых случаев:

  • скажем, пользователь пишет H E L L U BACKSPACE O

  • пользователь перемещается с помощью клавиш со стрелками

  • пользователь может разделять слова с помощью ПРОБЕЛ (это то, что я использовал), но также ENTER илизапятая и т. д.

Есть ли хороший способ обнаружить последнее написанное слово?

Цель: кодировать функцию автозаполнения, например: thx + <TAB> =>Текст заменен на «Большое спасибо».

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Это полностью работает для textarea и для contenteditable div:

var newText = 'hello\nnewline';
var newHtml = '<b>test</b> and<br>a <a href="hjkh">link</a>';

document.addEventListener("keydown", function(e) {
    var elt = e.target;
    if (elt.tagName.toLowerCase() === 'textarea' || elt.isContentEditable)
    {        
        if (e.keyCode == 9) {
            e.preventDefault();
            if (elt.isContentEditable) {  // for contenteditable
                elt.focus();
                sel = document.getSelection();
                sel.modify("extend", "backward", "word");
                range = sel.getRangeAt(0);
                console.log(range.toString().trim());
                range.deleteContents();
                var el = document.createElement("div");
                el.innerHTML = newHtml;
                var frag = document.createDocumentFragment(), node;
                while (node = el.firstChild) {
                    frag.appendChild(node);
                }
                range.insertNode(frag);
                range.collapse();
            } else {  // for texterea/input element
                var endingIndex = elt.selectionStart;
                var startingIndex = endingIndex && endingIndex - 1;
                var value = elt.value;
                var regex = /[ ]/;
                while (startingIndex > -1) {
                    if (regex.test(value[startingIndex])) {
                        ++startingIndex;
                        break;
                    }
                    --startingIndex;
                }
                if (startingIndex < 0) {
                    startingIndex = 0;
                }
                value = value.substring(0, startingIndex) + newText + value.substring(endingIndex);
                var cursorPosition = startingIndex + newText.length;
                e.target.value = value;
                e.target.setSelectionRange(cursorPosition, cursorPosition);
            }
        }
    }
});
<div contenteditable>Hello, press TAB to replace this WORD<br>Also press TAB after this ONE</div>
<textarea rows="8" cols="50" id="a">Hello, press TAB to replace this WORD
Also press TAB after this ONE</textarea>
0 голосов
/ 11 июня 2018

Вы можете использовать текущую позицию курсора, чтобы обнаружить последнее слово.Простой пример приведен ниже.

document.getElementById('foobar').addEventListener('keydown', e => {
  if( e.which == 9 ) {
    e.preventDefault();
    let endingIndex = e.target.selectionStart;
    let startingIndex = endingIndex && endingIndex - 1;
    let value = e.target.value;
    // putt all delemeters in it by which word can be splitted
    let regex = /[ ]/;

    while(startingIndex > -1){
      if(regex.test(value[startingIndex])){
        ++startingIndex;
        break;
      }
      --startingIndex;
    }

    // note you will have you apply check to avoid negative index
    if(startingIndex < 0) {
        startingIndex = 0;
    }
    console.log(value.substring(startingIndex, endingIndex));

    let newText = "replaced";
    value = value.substring(0, startingIndex) + newText + value.substring(endingIndex);
    let cursorPosition = startingIndex + newText.length;
    e.target.value = value;
    e.target.setSelectionRange(cursorPosition, cursorPosition);
  }
  
});
<textarea id="foobar"></textarea>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...