Следующее решение не работает для IE, для этого вам нужно применить объекты TextRange и т.д. Поскольку для этого используются выборки, в обычных случаях он не должен нарушать HTML, например:
<div>abcd<span>efg</span>hij</div>
С highlight(3,6);
выходы:
<div>abc<em>d<span>ef</span></em><span>g</span>hij</div>
Обратите внимание, как он переносит первый символ за пределами диапазона в em, а затем остальные символы в пределах span в новый. Где, как если бы он просто открывал его на символе 3 и заканчивал бы на символе 6, это дало бы недопустимую разметку, например:
<div>abc<em>d<span>ef</em>g</span>hij</div>
Код:
var r = document.createRange();
var s = window.getSelection()
r.selectNode($('div')[0]);
s.removeAllRanges();
s.addRange(r);
// not quite sure why firefox has problems with this
if ($.browser.webkit) {
s.modify("move", "backward", "documentboundary");
}
function highlight(start,end){
for(var st=0;st<start;st++){
s.modify("move", "forward", "character");
}
for(var st=0;st<(end-start);st++){
s.modify("extend", "forward", "character");
}
}
highlight(2,6);
var ra = s.getRangeAt(0);
var newNode = document.createElement("em");
newNode.appendChild(ra.extractContents());
ra.insertNode(newNode);
Пример: http://jsfiddle.net/niklasvh/4NDb9/
изменить Похоже, по крайней мере, у моего FF4 были проблемы с
s.modify("move", "backward", "documentboundary");
но в то же время вроде и без него работает, поэтому просто поменял на
if ($.browser.webkit) {
s.modify("move", "backward", "documentboundary");
}
забастовка>
редактировать, как указал Тим, модификация доступна только начиная с FF4, поэтому я применил другой подход к выбору, который не требует метода модификации, в надежде сделать его немного более браузерным. совместим (IE по-прежнему нуждается в собственном решении).
Код:
var r = document.createRange();
var s = window.getSelection()
var pos = 0;
function dig(el){
$(el).contents().each(function(i,e){
if (e.nodeType==1){
// not a textnode
dig(e);
}else{
if (pos<start){
if (pos+e.length>=start){
range.setStart(e, start-pos);
}
}
if (pos<end){
if (pos+e.length>=end){
range.setEnd(e, end-pos);
}
}
pos = pos+e.length;
}
});
}
var start,end, range;
function highlight(element,st,en){
range = document.createRange();
start = st;
end = en;
dig(element);
s.addRange(range);
}
highlight($('div'),3,6);
var ra = s.getRangeAt(0);
var newNode = document.createElement("em");
newNode.appendChild(ra.extractContents());
ra.insertNode(newNode);
пример: http://jsfiddle.net/niklasvh/4NDb9/
person
Niklas
schedule
05.06.2011
ab<x>cd<em>ef</x>f</em>. Вам нужно будет сделать что-то вродеab<x>cd</x><em><x>ef</x>g</em>- person serg   schedule 05.06.2011