31

我一直在努力使 textarea 的selectionStartselectionEnd属性与contenteditable div 元素一起工作。我在 google 和 SO 上查看了很多相关文章,但无济于事。我有类似于以下内容的内容,非常适用于 textarea。但我希望这个可以与 contenteditable div 一起使用。

function replaceVal(node, val, step){
    //...
    var cursorLoc =  node.selectionStart;
    node.value = node.value.substring(0, node.selectionStart - step) + value +
    node.value.substring(node.selectionEnd, node.value.length);
    node.scrollTop = scrollTop;
    node.selectionStart = cursorLoc + value.length - step;
    node.selectionEnd = cursorLoc + value.length - step;
  //...
}

如何修改它以使其与 contenteditable div 元素而不是 textarea 一起使用?

4

3 回答 3

12

试试这个,它返回选定的文本,无论它是否是 contentEditable 。

function GetSelectedText() {

            if (document.getSelection) {    // all browsers, except IE before version 9
                var sel = document.getSelection();
                    // sel is a string in Firefox and Opera, 
                    // and a selectionRange object in Google Chrome, Safari and IE from version 9
                    // the alert method displays the result of the toString method of the passed object
                alert(sel);
            } 
            else {
                if (document.selection) {   // Internet Explorer before version 9
                    var textRange = document.selection.createRange();
                    alert(textRange.text);
                }
            }
        }
<div>Test Example Microsoft T-shirt box</div>
<button onClick="GetSelectedText()">Get text</button>

我在 jsfiddler 中制作了这个示例,请参阅 在此处输入链接描述

于 2015-11-11T18:09:41.530 回答
1

使用getSelection()方法中的Selection对象来获取contentEditable 元素baseOffsetextentOffset

var sel = document.getSelection();
node.value = node.value.slice(0, sel.baseOffset - step) + value + node.value.slice(sel.extentOffset);
于 2021-05-31T22:35:29.750 回答
0

此答案使用非标准的 Selection#modify,但至少,我建议您使用“insertText”命令:

function replaceVal(val, step) {
  var selection = window.getSelection();
  for (var i = 0; i < step; i += 1) {
    selection.modify('extend', 'backward', 'character');
  }
  document.execCommand('insertText', false, val);
}
<label for="editable">Editable:</label>
<div contenteditable="true" id="editable">Test test test</div>
<label for="step">Step:</label>
<input type="number" id="step" name="step" min="0" step="1" value="0" />
<button onClick="replaceVal('insertion', Number(document.getElementById('step').value))">Get text</button>

于 2020-04-16T10:32:25.683 回答