Ну, я думаю, что использование библиотеки mark.js прекрасно в этом случае. Цель библиотеки - выделить все экземпляры определенного слова в документе HTML, но его можно настроить с помощью опции filter , а дополнительные атрибуты span могут быть добавлены через каждый . Опционная функция.
function markFunc(node, text, color) {
var instance = new Mark(node);
instance.mark(text, {
"element": "span",
"className": color,
"acrossElements": true,
"separateWordSearch": false,
"accuracy": "partially",
"diacritics": true,
"ignoreJoiners": true,
"each": function(element) {
element.setAttribute("id", "sohayb");
element.setAttribute("title", "sohayb_title");
},
"done":function(totalMarks) {
window.getSelection().empty();//This only in Chrome
console.log("total marks: " + totalMarks);
},
"filter": function(node, term, totalCounter, counter) {
var res = false;
if (counter == 0) {
res = selectionRange.isPointInRange(node, selectionRange.startOffset);
} else {
res = selectionRange.isPointInRange(node, 1);
}
console.log("Counter: " + counter + ", startOffset: " + selectionRange.startOffset);
return res;
}
});
};
Проверьте этот пример JSFiddle , чтобы получить готовый код, который подчеркивает выбор пользователя даже для нескольких элементов HTML.