更改contenteditable元素属性innerHTML之后 光标位置错乱
时间: 2023-08-31 10:06:47 浏览: 266
更改 `contenteditable` 元素的 `innerHTML` 属性后,光标位置错乱通常是由于浏览器重新渲染导致的。可以尝试在更改 `innerHTML` 属性之前记录光标的位置,然后在更改完成后再将光标位置设置回去。
具体实现方式可以使用 `Selection` 接口来获取和设置光标位置。例如,可以使用以下代码来获取当前选区的范围:
```
var selection = window.getSelection();
var range = selection.getRangeAt(0);
```
然后在更改 `innerHTML` 属性之后,将选区设置回去:
```
selection.removeAllRanges();
selection.addRange(range);
```
这样就可以保持光标位置不变了。
相关问题
怎么获取鼠标光标位置_元素contenteditable属性为true时,鼠标光标位置的问题
在元素的 `contenteditable` 属性为 true 时,可以使用 `window.getSelection()` 方法来获取鼠标光标位置。
下面是一个示例代码:
```javascript
function getCaretPosition(element) {
var caretOffset = 0;
var doc = element.ownerDocument || element.document;
var win = doc.defaultView || doc.parentWindow;
var sel;
if (typeof win.getSelection != "undefined") {
sel = win.getSelection();
if (sel.rangeCount > 0) {
var range = win.getSelection().getRangeAt(0);
var preCaretRange = range.cloneRange();
preCaretRange.selectNodeContents(element);
preCaretRange.setEnd(range.endContainer, range.endOffset);
caretOffset = preCaretRange.toString().length;
}
} else if ((sel = doc.selection) && sel.type != "Control") {
var textRange = sel.createRange();
var preCaretTextRange = doc.body.createTextRange();
preCaretTextRange.moveToElementText(element);
preCaretTextRange.setEndPoint("EndToEnd", textRange);
caretOffset = preCaretTextRange.text.length;
}
return caretOffset;
}
```
调用 `getCaretPosition(element)` 函数,即可获取 `element` 元素中鼠标光标的位置。
在contenteditable元素中插入DOM元素之后 光标跑到了最前面
这可能是因为在插入DOM元素时,没有正确地设置光标位置。你可以通过以下步骤来解决这个问题:
1. 在插入DOM元素之前,获取光标所在位置的范围(range)和偏移量(offset)。
2. 插入DOM元素后,将光标位置设置为之前获取的范围和偏移量。
下面是一个示例代码:
```
// 获取光标所在位置的范围和偏移量
var range = window.getSelection().getRangeAt(0);
var offset = range.startOffset;
// 在contenteditable元素中插入DOM元素
var newElement = document.createElement('div');
document.getElementById('editable').appendChild(newElement);
// 将光标位置设置为之前获取的范围和偏移量
range.setStart(newElement, offset);
range.setEnd(newElement, offset);
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
```
其中,`editable` 是你的 contenteditable 元素的 id。这段代码将在插入新的 `<div>` 元素后,将光标位置设置为新元素的起始位置,即在插入的 DOM 元素之后。
阅读全文