Надежно работать с выделенным текстом довольно сложно. Библиотека Тима Дауна Rangy может быть полезна там, он сглаживает многие специфические особенности браузера. (Даже если вы не хотите использовать библиотеку, вы можете изучить ее для методов.)
Одно из core Rangy окружает выделенный текст элементом, используя метод RangyRange#surroundContents
. Код для этого в демо выглядит следующим образом:
function getFirstRange() {
var sel = rangy.getSelection();
return sel.rangeCount ? sel.getRangeAt(0) : null;
}
function surroundRange() {
var range = getFirstRange();
if (range) {
var el = document.createElement("span");
el.style.backgroundColor = "pink";
try {
range.surroundContents(el);
} catch(ex) {
if ((ex instanceof rangy.RangeException || Object.prototype.toString.call(ex) == "[object RangeException]") && ex.code == 1) {
alert("Unable to surround range because range partially selects a non-text node. See DOM Level 2 Range spec for more information.\n\n" + ex);
} else {
alert("Unexpected errror: " + ex);
}
}
}
}
Вы бы сделали то же самое, но с a
вместо span
.