У меня есть этот код (он не является правильным, но это дает представление):Как установить позицию каретки в контентной форме с дочерними узлами?
function setCaret(contentEditable, pos) {
if (contentEditable.hasChildNodes()) {
var
nodes = contentEditable.childNodes,
pos2 = 0,
cpt = 0,
nb = nodes.length,
node;
for (cpt; cpt < nb && pos2 < pos; cpt++) {
node = nodes[cpt];
if (node.nodeType === 3) {
pos2 += node.length;
} else {
pos2 += node.textContent.length;
}
}
var textNode;
if (pos2 <= pos) {
textNode = contentEditable.childNodes[cpt];
pos = pos - pos2;
} else {
textNode = contentEditable.childNodes[cpt-1];
}
var range = document.createRange();
range.setStart(textNode, pos);
range.setEnd(textNode, pos);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
}
Идея заключается в том, чтобы найти позицию хорошего узла, основанного на данной позиции.
Пример (труба каретка):
Некоторые ** полужирный ** | текст.
- множество позиций = 14
- 5 узлов [#text, Ь, #text, б, #text]
- узел с кареткой (индекс узлов) =
- старт положение для узла 4: 13
- 14 - 13 =
range.setStart (узлы [4], 1);
Как работать с моим кодом во всех случаях (только для javascript (без библиотеки), IE необязательно)? Возможно, существует более простое решение?
(JSFiddle тест: https://jsfiddle.net/mg4mm528/)
Можете ли вы объяснить мне, как делать с 'execCommand'? Я не вижу. – Sven
Попробуйте этот пример execCommand https://developer.mozilla.org/en/docs/Rich-Text_Editing_in_Mozilla –
Я просто перемещаю каретку в заданную позицию. Мое contenteditable может содержать другие узлы, выделенные жирным шрифтом, и текст. – Sven