如何更改富文本编辑器文本区域中的插入符偏移量?

How to change the caret offset in a rich text editor textarea?

我有一个 wysihtml 富文本编辑器。如果满足某些条件,我想更改插入符号的偏移量。

因为 wysithtml textarea 并不是真正的 textarea div(它只是一个常规的 div)我不能使用通用的 textarea 策略来移动插入符号。但经过一些实验后,我发现将其视为 Selection 使我能够将其作为文本区域使用。

据我了解,更改插入符偏移量的正确方法是 Range.setStart(),但我不知道如何使用它。谁能帮帮我?

我已经设置好了this jsfiddle。尝试(在 Firefox 中)将插入符号移动到偏移量 27。然后编辑器的值将更改,并且插入符号将移动到偏移量 0。但是如何将插入符号移动到例如偏移量 35?

我已经更新了您的 fiddle 以按您希望的方式工作。
这是我修改的部分:

if (offsets.start_offset == 27) {
    editor.setValue("This is first line.<br>This is another second line.", true);

   /* START OF MODIFICATION */

      var range = window.getSelection().getRangeAt(0);
      range.selectNodeContents(textarea);

        var fromPos = 27;
        var lenTotal = ( textarea.textContent || textarea.innerText ).length;
        var lenCurTextNode = range.endContainer.lastChild.nodeValue.length;
        var lenNewWord= 'another '.length ;

        var newPos = ( fromPos - (lenTotal - lenCurTextNode) ) + lenNewWord;


      range.setStart(range.startContainer.lastChild , newPos);
      range.setEnd(range.endContainer.lastChild , newPos);

  /* END OF MODIFICATION */

      var offsets = getOffsets(textarea);
    console.log("I want offsets.start_offset to be 35, but it is " + offsets.start_offset)
  } else {
    console.log("Offset is from " + offsets.start_offset + " to " + offsets.end_offset );
  }

您必须处理 textNode 以创建一系列文本字符,而不是 HTMLElement。 就是为了那个,你的Range.setStart()没有效果,是'ranging'divs !

在您的示例文本区域中有一个 div,您需要在其中找到每个文本节点并与它们交互。
在上面的代码中 range.endContainer.lastChild 是一个 textNode (实际上是 textarea 的 lastChild).

希望对您有所帮助!


使用 Firefox 测试