Самый простой способ - использовать toString()
метод Range (ов) выделения, что именно то, что window.getSelection().toString()
указано делать в текущей версии новой спецификации Range WHATWG (хотя это противоречит тому, что делают некоторые браузеры и может изменяться или не изменяться).Следующее будет работать с несколькими выбранными диапазонами (которые поддерживает Mozilla), а также в IE <9. </p>
jsFiddle: http://jsfiddle.net/timdown/HkP2S/
Код:
function getSelectionRangeText() {
var selText = "";
if (window.getSelection) {
var sel = window.getSelection(), rangeCount = sel.rangeCount;
if (rangeCount) {
for (var i = 0, rangeTexts = []; i < rangeCount; ++i) {
rangeTexts.push("" + sel.getRangeAt(i));
}
selText = rangeTexts.join("");
}
} else if (document.selection && document.selection.type == "Text") {
selText = document.selection.createRange().text;
}
return selText;
}
ОБНОВЛЕНИЕ
Это решение включает текст внутри элементов <script>
и <style>
.Чтобы удалить это, вы можете использовать cloneContents()
в диапазонах выбора и проходить через DOM полученных фрагментов документа, собирая текст только из текстовых узлов, не содержащихся в элементах <script>
и <style>
.Вы также можете расширить это, чтобы удалить текст, который находится внутри элементов с помощью CSS display: none
.
jsFiddle: http://jsfiddle.net/timdown/HkP2S/2/
Код:
function getSelectionRangeText() {
var selText = "", selTextParts = [];
function getNodeText(node) {
if (node.nodeType == 3) {
selTextParts.push(node.data);
} else if (node.hasChildNodes()
&& !(node.nodeType == 1 && /^(script|style)$/i.test(node.tagName))) {
for (var child = node.firstChild; !!child; child = child.nextSibling) {
getNodeText(child);
}
}
}
if (window.getSelection) {
var sel = window.getSelection(), rangeCount = sel.rangeCount;
if (rangeCount) {
for (var i = 0; i < rangeCount; ++i) {
getNodeText(sel.getRangeAt(i).cloneContents());
}
selText = selTextParts.join("");
}
} else if (document.selection && document.selection.type == "Text") {
selText = document.selection.createRange().text;
}
return selText;
}