Rangy (JS/jQuery) разделенный узел
Как бы я разделить узел / элемент в позиции (выбор).
Пример у меня есть эта разметка:
<p>This is <a href="">a te|st</a>, you like?</p>
(эта труба представляет позицию / выбор)
Я хочу преобразовать это в:
<p>This is <a href="">a te</a></p>|<p><a href="">st</a>, you like?</p>
Поддержание выбора.
Есть идеи?
Я и использую библиотеку Rangy, а также jQuery, но могу использовать raw JS, если применимо.
1 ответ
Решение
Вы можете сделать это, создав диапазон, который простирается от каретки до точки сразу после абзаца и используя его extractContents()
метод.
Демонстрация в реальном времени: http://jsfiddle.net/timdown/rr9qs/2/
Код:
var sel = rangy.getSelection();
if (sel.rangeCount > 0) {
// Create a copy of the selection range to work with
var range = sel.getRangeAt(0).cloneRange();
// Get the containing paragraph
var p = range.commonAncestorContainer;
while (p && (p.nodeType != 1 || p.tagName != "P") ) {
p = p.parentNode;
}
if (p) {
// Place the end of the range after the paragraph
range.setEndAfter(p);
// Extract the contents of the paragraph after the caret into a fragment
var contentAfterRangeStart = range.extractContents();
// Collapse the range immediately after the paragraph
range.collapseAfter(p);
// Insert the content
range.insertNode(contentAfterRangeStart);
// Move the caret to the insertion point
range.collapseAfter(p);
sel.setSingleRange(range);
}
}