Eli*_*lie 27 javascript contenteditable
我正在将一个元素插入到contentEditable div中,但浏览器会在插入的元素之前设置光标的位置.是否可以在插入的元素后面设置光标,以便用户不必重新调整光标位置就可以输入?
Tim*_*own 29
以下功能将执行此操作.DOM Level 2 Range对象使这在大多数浏览器中变得容易.在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);
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16156 次 |
| 最近记录: |