我将元素插入到contentEditable div中,但浏览器在插入元素之前设置光标的位置。是否可以在插入元素之后立即设置光标,以便用户不必重新调整光标位置就可以继续打字?在内容可编辑div中的插入元素之后立即设置插入符号位置
26
A
回答
28
下面的函数将做到这一点。 DOM Level 2范围对象在大多数浏览器中都很容易实现。在IE中,你需要在你插入的节点后面插入一个标记元素,将选择移动到它然后删除它。
活生生的例子: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 library。等效代码会有
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);
}
}
0
如果要插入一个空div,p或跨度,我认为需要有“东西”新创建的元素中的劫掠的范围 - 在为了把脱口秀放在那里。
这是我的黑客,似乎可以在Chrome中正常工作。这个想法只是简单地将一个临时字符串放入元素中,然后在插入符号后将其删除。
// 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 = "";
相关问题
- 1. 在内容可编辑元素中设置插入位置
- 2. 插入不可编辑元素后的CKEditor光标位置
- 3. 插入符号位置在contenteditable div
- 4. 在div内容中查找字符中的插入符号位置可用角度编辑
- 5. 在插入位置插入文本到可编辑的IFRAME(IE)
- 6. Froala编辑器:单击div时插入插入位置
- 7. 在Chrome/webkit中设置contenteditable div div中的插入符号位置
- 8. 将插入符号的值设置到某个位置后不能得到插入符号位置值
- 9. 包含位置:div内的绝对元素,以便可以在前后插入一个位置:relative div
- 10. 如何在可编辑的iframe上设置插入符的位置?
- 11. 可编辑ComboBox设置插入位置使用mvvm
- 12. 如何修改可编辑div元素的html结构更改时的选择/插入符号位置?
- 13. 我怎样才能在可编辑div中存储插入符的位置?
- 14. 设置插入符位置在“CONTENTEDITABLE”的div有孩子
- 15. 在特定位置插入元素
- 16. 在第n个位置插入元素
- 17. 在指定位置插入元素
- 18. 如何设置extJS标记域中的插入符号位置
- 19. Javascript插入元素的字符引用可编辑的DIV与子元素
- 20. Contenteditable div设置插入符号替换文本后用HTML
- 21. 得到最后一个字符在插入符号前插入位置
- 22. Editable Div插入位置
- 23. jQuery插入元素符号
- 24. 在Jquery同位素中插入内容
- 25. 如何获得HTML输入元素中游标/插入符号的位置?
- 26. 使用:在没有插入内容的CSS伪元素之后
- 27. 如何设置RightClick位置上的插入符号?
- 28. 将插入符号的位置设置为0的内部节点中的contenteditable元素
- 29. Bootstrap v3插入符号位置开关
- 30. 如何使用html子元素在contenteditable div中获取插入符的位置?
相关:http://stackoverflow.com/questions/2920150/insert-text-at-cursor-in-a-content-editable-div – payne 2011-01-29 02:46:31
那并没有回答我的问题。我可以将元素插入插入位置,但我需要将插入符号放在插入元素的后面。 – Elie 2011-01-29 02:48:22