4

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

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

4

2 回答 2

1

这个怎么样?Kinda 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)));
于 2009-08-24T18:55:46.417 回答
1

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

/\s+/
于 2009-08-24T10:08:04.940 回答