установить курсор в конце подстроки в управляемом содержимым div

#javascript #jquery

#javascript #jquery

Вопрос:

Здесь пользователь вводит некоторую строку, и строка содержит Mahi в качестве подстроки. Я пытаюсь поместить курсор в конец Mahi по нажатию кнопки?

.html

 <div id="demo" contenteditable="true"></div>

<button id="btn" onclick="focusAtMen()"></button>
  

js

 // lets suppose user input is "Hi.......Mahi, .....?";
// here dots may be any characters

focusAtMen(){
var editor = document.getElementById("demo");
// set focus on `contentEditable div` and `place cursor at the end` of `Mahi` , thats a user Input.

}
  

Ответ №1:

Вы можете использовать Range.setStart и Selection для определения положения курсора курсора. Функция setStart принимает узел и смещение в качестве начальной позиции внутри этого узла.

Приведенный ниже код обрабатывает случай, когда Mari присутствует в тексте. Он также обрабатывает случай, когда Mari не содержится в строке, и в этом случае он помещает курсор в последний символ текста.

 function focusAtMen() {
  var textToFind = 'Mahi';
  var editor = document.getElementById("demo");

  var range = document.createRange();
  var sel = window.getSelection();
  
  // get the index of the start of 'Mahi'
  var indexOfMahi = editor.innerText.lastIndexOf(textToFind);
  
  if (indexOfMahi > -1) {
      // if text contains Mari
      range.setStart(editor.childNodes[0], indexOfMahi   textToFind.length);
  } else if (editor.innerText.length > 0) {     
     // if text does not contain Mari set cursor to the end of the string 
     range.setStart(editor.childNodes[0], editor.innerText.length);
  } else {
     // there is no text
     range.setStart(editor, 0);
  }
  
  range.collapse(true);
  sel.removeAllRanges();
  sel.addRange(range);
}  
 <div id="demo" contenteditable="true">some text Mahi and another Mahi included</div>
<button id="btn" onclick="focusAtMen()">Click</button>  

Обратите внимание, что приведенный выше код чувствителен к регистру, если вам нужно, чтобы это работало mari и Mari его нужно будет соответствующим образом изменить.

Комментарии:

1. Спасибо, Халдо, можешь ли ты предложить какое-то решение, когда пользователь вводит дубликаты ‘Mahi’, а затем, как с этим справиться. indexOfMahi 4, здесь 4 — длина ‘Mahi’? Я обновил вопрос. Спасибо

2. @Mahi Ваш обновленный вопрос неясен. Я обновил ответ, используя lastIndexOf который поместит курсор после последнего появления Mahi. Да, я использую длину Mahi (4) для позиционирования курсора.

3. @Mahi пожалуйста, задайте новый вопрос и откатите свою правку. Отредактированный вопрос теперь отличается от того, который вы задавали изначально, и поэтому вам следует задать новый вопрос.