2

我正在将文本插入到 SCeditor 的实例中,并希望在插入后将光标移动到插入文本中的特定位置。

SCeditor 初始化代码:

var textarea = $('textarea[name="'+fieldname+'"]')[0];

// shortcut to insert custom text
sceditor.instance(textarea).addShortcut('ctrl+alt+b', function() 
{
   var fieldname = this.opts.id;
   parent.window['sce_'+fieldname].insertText('\\sqrt{}');
   
   // move cursor one to the left, so it is within the two brackets
   // ...
   
   return;
}

如何移动光标?


我发现的相关代码处理范围对象,但没有关于如何移动光标的示例:

   var rangeHelper = this.getRangeHelper();
   var range = rangeHelper.selectedRange();
   rangeHelper.selectRange(range);
   range.setStartAfter(parent);
   rangeHelper.selectRange(range);
4

2 回答 2

1

乱搞范围是相当可怕的。最简单的方法可能是将文本插入为 HTML 并包含一些特殊的选择标记,SCEditor 使用这些标记来恢复选择。这应该有效:

// Remove any current markers
instance.getRangeHelper().removeMarkers()
// Insert the text with the special marker tags
instance.getRangeHelper().insertHTML(
    '\sqrt{' +
    '<span id="sceditor-start-marker" class="sceditor-selection sceditor-ignore" style="display: none; line-height: 0;"> </span>' +
    '<span id="sceditor-end-marker" class="sceditor-selection sceditor-ignore" style="display: none; line-height: 0;"> </span>' +
    '}'
);
// Focus will set the cursor to the markers
instance.focus()

在源代码模式下,它更容易(在所见即所得模式下不起作用,可能是它应该做的事情):

instance.insertText('\sqrt{', '}');
于 2021-10-10T23:35:20.333 回答
-1

您需要使用Range.setStart()自定义偏移量。

function setCaret() {
    var el = document.getElementById("editable")
    var range = document.createRange()
    var sel = window.getSelection()
    
    range.setStart(el.childNodes[2], 5)
    range.collapse(true)
    
    sel.removeAllRanges()
    sel.addRange(range)
}
<div id="editable" contenteditable="true">
  text text text<br>text text text<br>text text text<br>
</div>

<button id="button" onclick="setCaret()">focus</button>

于 2021-09-26T13:12:56.537 回答