В настоящий момент я фиксирую выбор текста пользователей через s = window.getSelection()
и range = s.getRangeAt(0)
(браузер в стороне). Всякий раз, когда делается выбор внутри a <p>
, я могу легко вызвать range.surroundContents(document.createElement("em"))
, чтобы выделенный текст был обернут тегом <em>
.
В этом примере, однако,
<p>This is the Foo paragraph.</p>
<p>This is the Bar paragraph.</p>
<p>This is the Baz paragraph.</p>
когда пользователь делает выбор текста от Foo
до Baz
, я не могу вызывать range.surroundContents
: сбой Firefox с The boundary-points of a range does not meet specific requirements." code: "1
, потому что выбор недействителен HTML.
В этом случае я хотел бы как-то получить следующее состояние в DOM:
<p>This is the <em>Foo paragraph.</em></p>
<p><em>This is the Bar paragraph.</em></p>
<p><em>This is the Baz</em> paragraph.</p>
Любые идеи?
FYI: Я пытался с API Range
, но я не вижу прямого способа достижения этого результата. С
var r = document.createRange();
r.setStart(range.startContainer, range.startOffset);
r.setEnd(range.endContainer, range.endOffset+40);
selection.addRange(r);
В конечном итоге я могу что-то взломать, переставив смещения, но только для контейнеров 'start' и 'end'! (т.е. в этом случае абзац Bar
, как его обернуть?)