选择单词边界,但不包括标点符号
Selection to word boundaries, but excluding punctuation signs
我尝试修改用户所做的选择,使其始终是完整的单词。例如,鉴于"报告:奥巴马总统寻求在阿富汗保留9800名美军……"消息人士说,今年之后,如果用户只是选择"阿富汗人",我希望选择修改为"阿富汗"。经过一番搜索,我在Stackoverflow上偶然发现了以下解决方案:
snapSelectionToWord : function() {
var sel;
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);
var direction = [];
if (backwards) {
direction = ['backward', 'forward'];
} else {
direction = ['forward', 'backward'];
}
sel.modify("move", direction[0], "character");
sel.modify("move", direction[1], "word");
sel.extend(endNode, endOffset);
sel.modify("extend", direction[1], "character");
sel.modify("extend", direction[0], "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();
}
}
},
原则上,它工作得很好。然而,也有一些病理病例。例如,选择"阿富汗……"时,它会切换到"阿富汗……"(我想要"阿富汗")。和选择的结果是一样的。(这里期望的结果是:"after")。主要问题似乎是粒度word
只考虑空格而不考虑其他标点符号。
我现在的想法是将粒度从word
更改为character
,并将其放入循环中,直到达到标点符号。这对于sel.modify("extend", ...);
行工作得很好,但对于sel.modify("move", ...);
行则不是(如预期的那样)。在collapse
和第一次move
修改之后,sel.toString()
都是空的。因此,我不能循环第一个/最后一个字符来逐字符移动。在sel.extend(endNode, endOffset);
之后,再次设置sel.toString()
,并且使用循环的方法有效。
我偶然发现了rangy,它很好地解决了我的问题。使用这个库将我的函数简化为:
snapSelectionToWord : function() {
rangy.getSelection().expand("word");
},
感谢开发者让我的生活变得如此轻松!
相关文章:
- 如何将页面上的所有电话号码更改为可点击链接,不包括特定类别的元素
- 将正则表达式重新分解为不包括空组
- 为什么从JSON文本到类型的转换不包括函数
- XMLHttpRequest调用不包括If Modified Since标头
- 使用 JavaScript 执行一行 PHP(不包括 PHP 文件)
- 捆绑器不包括 .min 文件
- 与冒号(不包括冒号)之间的正则表达式单词匹配
- 包含特殊字符 (!,@,#,&) 不包括其他特殊字符
- Javascript RegEx:如何获取单引号之间的名称(不包括单引号)
- Javascript RegEx匹配URL's,但不包括图像
- Rails不包括用于javascript的require_tree
- 获取JS中特定路径的cookie,不包括根路径
- requireJS优化器不包括嵌套的require调用
- 不包括'+'和'&'正则表达式中的字符
- 如何获取html页面中所有p和h标记的值,不包括所有其他标记
- 使用javascript查找小数前的整数(不包括特殊字符)
- Javascript RegEx:在符号后获取1或2位数字(不包括该符号)
- 如何获取应用程序.js其中不包括压缩代码
- 选择单词边界,但不包括标点符号
- 正则表达式,用于查找URL,但不包括URL后的标点符号