确保范围对象不会在单词的中间开始或结束

时间:2009-08-23 22:11:11

标签: javascript firefox dom range

我的应用程序需要大量使用范围(https://developer.mozilla.org/en/DOM/range)。特别是,用户经常突出显示文本然后对其进行操作。有时,用户会意外地突出显示包含单词片段的文本,这会产生奇怪的结果。

我希望能够,给定一个范围,检查它是否在一个单词的中间开始或结束然后,如果是,则展开它以便它包含它开始的整个单词/结束于中间。

2 个答案:

答案 0 :(得分:1)

我没有使用范围,但听起来像突出显示应该在空格字符后立即开始并在空白字符之前结束。您必须编写一个执行此检查的函数onmouseup事件。对此功能的响应应该是在一个单词的结尾处突出显示应该在哪里的自动校正。我还可以在突出显示开始时使其工作,以便用户可以在单词的中间单击并使高亮显示正确以从单词的开头捕获,以便增加具有运动受损界面的用户的可访问性。您还需要确保使用针对正则表达式变量的测试方法定义空格字符:

/\s+/

答案 1 :(得分:1)

这个怎么样?有点hacky,但我在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)));