Основная проблема здесь заключается в том, что обработка HTML как строки и замена его частей, как вы делаете, является очень хрупким подходом (например, соответствующий фрагмент текста, часть которого уже выделена жирным шрифтом, или значение атрибута, содержащее сопоставить выделенный текст, например). Вместо этого вы можете использовать встроенный браузер , чтобы найти соответствующий текст . Вот функция из этого вопроса, адаптированная для вашего случая:
function doSearch(text) {
if (window.find && window.getSelection) {
document.designMode = "on";
var sel = window.getSelection();
sel.collapse(document.body, 0);
while (window.find(text)) {
document.execCommand("Bold", false, null);
sel.collapseToEnd();
}
document.designMode = "off";
} else if (document.body.createTextRange) {
var textRange = document.body.createTextRange();
while (textRange.findText(text)) {
textRange.execCommand("Bold", false, null);
textRange.collapse(false);
}
}
}
Кроме того, функция GetSelected
является неправильной (хотя в данном случае она по совпадению работает), так как возвращает строку в IE <9 и объект <code>Selection в других браузерах. Вы также не объявили переменную GetSelected
. Вот более простая и лучшая замена:
function GetSelected() {
var txt = ""
if (window.getSelection) {
txt = window.getSelection().toString();
} else if (document.selection && document.selection.type == "Text") {
txt = document.selection.createRange().text;
}
return txt;
}
Обратите внимание, что вам не нужна эта функция, если вы используете мой предложенный подход.