Как насчет этого? Вроде хак, но я протестировал его в Firefox, и он, похоже, работал. Может быть, это поможет вам начать:
function fixRange(range)
{
var rangeString = range.toString();
try
{
while (rangeString[0] != " ")
{
range.setStart(range.startContainer, range.startOffset - 1);
rangeString = range.toString();
}
range.setStart(range.startContainer, range.startOffset + 1);
} catch (e) {}
try
{
while (rangeString[rangeString.length - 1] != " ")
{
range.setEnd(range.endContainer, range.endOffset + 1);
rangeString = range.toString();
}
range.setEnd(range.endContainer, range.endOffset - 1);
} catch (e) {}
return range;
}
Пример использования (повторный выбор выбранного диапазона):
var selection = window.getSelection();
selection.addRange(fixRange(selection.getRangeAt(0)));