【问题标题】:Javascript: text selection including special charactersJavascript:包括特殊字符的文本选择
【发布时间】:2015-03-31 07:27:49
【问题描述】:

我正在使用这个 javascript 代码来获取插入符号之前的单词:

sel = window.getSelection()
var selectedRange = sel.getRangeAt(0);
sel.collapseToStart();
sel.modify("move", "backward", "word");
sel.modify("extend", "forward", "word");

这会得到单词,即使没有尾随空格(例如“word”),但会省略单词末尾的特殊字符(例如,而不是 "word:" 只会得到 “单词”)。

如果我在单词中包含冒号,例如“wo:rd”,则会得到全部 5 个字符。

不过,我确实需要获取尾随特殊字符。我该怎么做?

【问题讨论】:

  • 好问题,我正在研究一个解决方案 - 我们要寻找的输出似乎是“选择”而不是“范围”,我们需要获取修改后选择的值,然后将正则表达式与父节点的 nodeValue 匹配,例如 /value + [^A-Za-z0-9]/ig
  • Selection.modify() 在浏览器之间的实现不一致,而 IE 并没有全部实现。另一种方法是Rangy's TextRange module(免责声明:由我编写),它在浏览器中始终如一地执行此操作,并允许使用正则表达式来指定单词的构成。

标签: javascript html web range selection


【解决方案1】:

我明白了,我为示例代码的草率道歉,但这里是:jsFiddle

var i = 0;

function getBeforeSelection() {
    var sel = window.getSelection(),
        selectedRange = sel.getRangeAt(0),
        sel2,
        res,
        finalValue,
        regexObj;

    sel.collapseToStart();
    sel.modify("move", "backward", "word");
    sel.modify("extend", "forward", "word");

    finalValue = sel.toString();

    regexObj = new RegExp(finalValue + '[^A-Za-z0-9\s\b]*');

    res = sel.focusNode.nodeValue.trim().match(regexObj);

    alert(res);

}

// added for sake of example, calls getBeforeSelection on double click 
// (when selection is made)
document.addEventListener('click', function (e) {
    i++;

    if (i > 1) {
        getBeforeSelection();
        i = 0;
    } 
});

【讨论】:

  • 在 Firefox 中不起作用。 Selection.modify() 在浏览器之间的实现不一致。
猜你喜欢
  • 2018-05-22
  • 1970-01-01
  • 2014-01-27
  • 2021-04-04
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多