我正在使用此答案中显示的技术将网页的选择扩展到单词边界:
function snapSelectionToWord() {
var sel;
// Check for existence of window.getSelection() and that it has a
// modify() method. IE 9 has both selection APIs but no modify() method.
if (window.getSelection && (sel = window.getSelection()).modify) {
sel = window.getSelection();
if (!sel.isCollapsed) {
// Detect if selection is backwards
var range = document.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset);
var backwards = range.collapsed;
range.detach();
// modify() works on the focus of the selection
var endNode = sel.focusNode, endOffset = sel.focusOffset;
sel.collapse(sel.anchorNode, sel.anchorOffset);
if (backwards) {
sel.modify("move", "forward", "word");
sel.extend(endNode, endOffset);
sel.modify("extend", "backward", "word");
} else {
sel.modify("move", "backward", "word");
sel.extend(endNode, endOffset);
sel.modify("extend", "forward", "word");
}
}
} else if ( (sel = document.selection) && sel.type != "Control") {
var textRange = sel.createRange();
if (textRange.text) {
textRange.expand("word");
// Move the end back to not include the word's trailing space(s),
// if necessary
while (/\s$/.test(textRange.text)) {
textRange.moveEnd("character", -1);
}
textRange.select();
}
}
}
到现在为止还挺好。但是,如果您snapSelectionToWord
在所选内容上多次调用该函数,则每次调用时它都会在两个方向上向外扩展一个单词,如果您想在选择文本时多次调用它,这并不好。
这是一个现场 jsFiddle 示例,它允许您重复单击“Snap”按钮,它演示了问题。
如果原始解决方案已经在单词边界上,如何修复原始解决方案以使其不扩展选择?
- 我更愿意对原始解决方案发表评论,但遗憾的是,StackOverflow 业力旅还没有给我足够的业力——否则,我只会在那里问。而且我不确定如何解决这个问题,所以我不会编辑原始解决方案。
编辑:为每个请求添加代码片段