在contentEditable div的插入元素后面设置插入符的位置
我将一个元素插入到contentEditable div中,但是浏览器在插入元素之前设置了光标的位置。 是否可以在插入元素后面设置光标,以便用户不必重新调整光标位置就可以继续input?
以下function将做到这一点。 DOM Level 2 Range对象在大多数浏览器中都很简单。 在IE中,你需要在你插入的节点后插入一个标记元素,将select移动到它然后删除它。
现场示例: http : //jsfiddle.net/timdown/4N4ZD/
码:
function insertNodeAtCaret(node) { if (typeof window.getSelection != "undefined") { var sel = window.getSelection(); if (sel.rangeCount) { var range = sel.getRangeAt(0); range.collapse(false); range.insertNode(node); range = range.cloneRange(); range.selectNodeContents(node); range.collapse(false); sel.removeAllRanges(); sel.addRange(range); } } else if (typeof document.selection != "undefined" && document.selection.type != "Control") { var html = (node.nodeType == 1) ? node.outerHTML : node.data; var id = "marker_" + ("" + Math.random()).slice(2); html += '<span id="' + id + '"></span>'; var textRange = document.selection.createRange(); textRange.collapse(false); textRange.pasteHTML(html); var markerSpan = document.getElementById(id); textRange.moveToElementText(markerSpan); textRange.select(); markerSpan.parentNode.removeChild(markerSpan); } }
或者,你可以使用我的Rangy库 。 那里的等效代码将会是
function insertNodeAtCaret(node) { var sel = rangy.getSelection(); if (sel.rangeCount) { var range = sel.getRangeAt(0); range.collapse(false); range.insertNode(node); range.collapseAfter(node); sel.setSingleRange(range); } }
如果你插入一个空白的div,p或span,我相信在新创build的元素里面需要有一些东西来抓取范围,并且把插入符号放在里面。
这是我的黑客,似乎在Chrome中工作正常。 这个想法只是在元素内部放置一个临时string,然后在插入符号后将其删除。
// Get the selection and range var idoc = document; // (In my case it's an iframe document) var sel = idoc.getSelection(); var range = sel.getRangeAt(0); // Create a node to insert var p = idoc.createElement("p"); // Could be a div, span or whatever // Add "something" to the node. var temp = idoc.createTextNode("anything"); p.appendChild(temp); // -- or -- //p.innerHTML = "anything"; // Do the magic (what rangy showed above) range.collapse(false); range.insertNode( p ); range = range.cloneRange(); range.selectNodeContents(p); range.collapse(false); sel.removeAllRanges(); sel.addRange(range); // Clear the non p.removeChild(p.firstChild); // -- or -- //p.innerHTML = "";
- contenteditable中的占位符 – 焦点事件问题
- AngularJS和contentEditable两种方式绑定不能按预期工作
- jquery在contenteditable div中设置光标位置
- contenteditable,在文本的末尾设置插入符号(跨浏览器)
- 如何使HTML <div>元素可编辑跨浏览器?
- 将光标移至CKEditor中的特定位置
- 任何所见即所得的富文本编辑器不使用HTML(contenteditable或designMode),一个la(新的)Google文档?
- 处理contentEditable DIV上的换行符
- 防止contenteditable在ENTER上添加<div> – Chrome