Это на самом деле довольно сложно сделать, потому что вам нужно рассмотреть шесть случаев:
- Выбор не в абзаце (легко);
- Весь выбор в пределах одного абзаца (легко);
- Весь выбор пересекает один или несколько пунктов одного брата (сложнее);
- Выбор начинается или заканчивается в элементе, не входящем в абзац (сложнее);
- Составленные абзацы находятся на разных уровнях, например, один находится внутри элемента списка, в то время как два других являются родственными элементами списка (еще сложнее); и
- Некоторая комбинация вышеперечисленного.
Итак, сначала вы должны решить, насколько полно вы хотите, чтобы решение было. Я рассмотрю только самые простые случаи (1) и (2).
function getSelectedParagraphText() {
if (window.getSelection) {
selection = window.getSelection();
} else if (document.selection) {
selection = document.selection.createRange();
}
var parent = selection.anchorNode;
while (parent != null && parent.localName != "P") {
parent = parent.parentNode;
}
if (parent == null) {
return "";
} else {
return parent.innerText || parent.textContent;
}
}
Примечание: Если вам нужны теги, замените textContent на innerHTML.
Редактировать: Добавлена улучшенная версия, включая лучшую совместимость с браузером.