我有一個 contentEditable
div, innerHTML
可以在編輯時通過AJAX更新。問題是,當您更改div的內容時,它會將光標移動到div的末尾(或根據瀏覽器失去焦點)。在更改
innerHTML
然後恢復之前,什麽是存儲插入位置的良好跨瀏覽器解決方案?
保存和恢復contentEditable div的插入位置
最佳答案
回到2016年:)
在我遇到這個解決方案後,它並不適合我,因為我的DOM在每次打字後都完全取代了。我做了更多的reasech,並提供了簡單的解決方案,保存光標的角色的位置,為我工作完美。
想法很簡單。
- 在插入符號之前找到charachters的長度並保存。
- 更改DOM。
- 使用
TreeWalker
在上下文節點
的文本節點
上行走並計算字符,直到我們得到正確的文本節點</代碼>及其中的位置
兩個邊緣案例:
-
內容已完全刪除,因此沒有
文本節點
:
so :將光標移動到上下文節點的開頭 -
內容少於
index
指向的內容:
so :將光標移動到最後一個節點的末尾
<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">
function saveCaretPosition(context){
var selection = window.getSelection();
var range = selection.getRangeAt(0);
range.setStart( context, 0 );
var len = range.toString().length;
return function restore(){
var pos = getTextNodeAtPosition(context, len);
selection.removeAllRanges();
var range = new Range();
range.setStart(pos.node ,pos.position);
selection.addRange(range);
}
}
function getTextNodeAtPosition(root, index){
var lastNode = null;
var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT,function next(elem) {
if(index >= elem.textContent.length){
index -= elem.textContent.length;
lastNode = elem;
return NodeFilter.FILTER_REJECT
}
return NodeFilter.FILTER_ACCEPT;
});
var c = treeWalker.nextNode();
return {
node: c? c: root,
position: c? index: 0
};
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/prism.min.js"></script>
<link href="https://rawgit.com/PrismJS/prism/gh-pages/themes/prism.css" rel="stylesheet"/>
Edit the CSS Snippet
p { color: red }
<script > var code = document.getElementsByTagName('code')[0]; code.addEventListener('input',function() { var restore = saveCaretPosition(this); Prism.highlightElement(this); restore(); }) </script></div> </div>
轉載註明原文: 保存和恢復contentEditable div的插入位置
猜你喜歡
- 如何保存和恢復Swift中的NSScrollView滾動位置?
- WPF GridSplitter - 按比例保存和恢復位置和分割
- 如何保存和恢復圖標和文件夾位置?
- 在contenteditable div中獲取並設置插入符(光標)的位置
- 在Gtk中保存並恢復窗口的大小和位置#
- 在GTK中保存/恢復窗口位置
- 在Chrome/webkit中的contenteditable div圖層中設置插入符號位置
- 如何在特定的contenteditable div上設置插入符/光標位置?
- 如何在Mobile Safari中為contenteditable div設置文本插入位置?
- 在ContentEditable Div中設置插入符號